Python入门自学进阶-Web框架——4、HttpRequest和HttpResponse及模板

2023-05-16

HTTP请求中产生两个核心的对象:
http请求:HttpRequest对象
http响应:HttpResponse对象

所在位置django.http,前边用的reques就是HttpRequest对象。

HttpRequest对象的属性:

path:请求页面的全路径,不包括域名和端口
method:请求中使用的HTTP方法的字符串表示,全大写表示,如POST、GET等
GET:包含所有HTTP GET参数的类字典对象
POST:包含所有HTTP POST参数的类字典对象。服务器收到空的POST请求的情况也是可能发生的,即表单form通过HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
if req.POST来判断是否使用了HTTP POST方法;应该使用 if req.method == 'POST'
COOKIES:包含所有cookies的标准python字典对象;keys和values都是字符串。
FILES:包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name=""/>标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
    filename:上传文件名,用字符串表示
    content_type:上传文件的Content Type
    content:上传文件的原始内容

user:是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymouseUser的实例。可以通过user的is_authenticated()方法来辨别用户是否登陆:if req.user.is_authenticaed();只有激活Django中的AuthenticationMiddleware时该属性才能用
session:    唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。

HttpRequest对象的方法:get_full_path(),比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123
req.path得到的是:/index33

HttpResponse对象:

对于HttpRequest对象,是Django自动创建的,但是HttpResponse对象就必须自己创建。每个views请求处理方法必须返回一个HttpResponse对象。

HttpResponse类在django.http.HttpResponse

在HttpResponse对象上扩展的常用方法有:
页面渲染:render(),render_to_response()
页面跳转:redirect()
locals():可以直接将函数中所有的变量传给模板

render()与redirect()的区别,render是直接渲染一个页面文件,而redirect是重新提交一个请求路径。

测试:

登录页面:
 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>欢迎登陆!!</h1>
    {{ msg }}
    <form action="/app01/login/" method="post">
        <input type="submit" value="submit">
    </form>
</body>
</html>

路由:

from django.contrib import admin
from django.urls import path,re_path,include
from app01 import views,views_app01
urlpatterns = [
    path('new/story/',views.app_story),
    path('login/',views_app01.login),

]

视图函数:

from django.shortcuts import render,HttpResponse,redirect,reverse
from pathlib import Path
import os
import datetime
from app01 import models

def login(req):
    msg = ""
    if req.method == "GET":
        msg = "经过了if逻辑判断!"
        return render(req,"login.html",{"msg":msg})
    if req.method == "POST":
        login_fail = 1
        if login_fail:
            return render(req,"login.html",{"msg":msg})
            # return redirect("/app01/login/")

第一次进入:

视图函数使用render,点击submit按钮,这时只是渲染了login.html页面,这时的结果 :

没有经过if逻辑判断,直接渲染的login.html, 所以,msg是空,注意,这里的空,不是msg=“”赋值的,而是根本没有定义,渲染就没有经过msg=""这里。

视图函数使用redirect,点击submit,使用redirect是提交的路径,相当于又走了一遍请求,经过了if

 模板:Template和Context

不使用模板直接将HTML硬编码到视图里,也可以实现内容反馈前端,但是却并不是一个好主意。 主要原因:

1、对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。

2、Python 代码编写和 HTML 设计是两项不同的工作,由不同的人员(或部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。

3、程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。

将页面的设计和Python的代码分离开会更干净简洁更容易维护,于是出现了模板

模板就是HTML+逻辑控制语句

对于前面views中的函数,最后的render(req,“index.html”,{“abc”:times}),第二个参数叫做模板,第三个参数,即字典叫做Context上下文。

在Django中,模板和上下文都是一个对象,在Python交互窗口中演示:

视图文件中函数最后返回的: render(req,“index.html”,{“abc”:times}),实际就是先读取index.html模板文件,生成一个魔板对象,像上图中的t,然后将第三个参数{“abc”:times}封装成上下文对象,然后魔板对象调用render,使用上下文对象渲染模板。

一个模板可以反复使用多次,被不同的Context上下文渲染:

在Django中视图函数的各种写法:

def current_time(req):
    # 原始的视图函数,视图函数的作用就是最后反馈内容给前端浏览器,实际就是反馈HttpResponse对象
    now=datetime.datetime.now()
    html="<html><body>现在时刻:<h1>%s.</h1></body></html>" %now
    # 使用字符串格式化命令,替换处理后反馈给浏览器的内容
    return HttpResponse(html)



def current_time(req):

    # django模板修改的视图函数
    now=datetime.datetime.now()
    t=Template('<html><body>现在时刻是:<h1 style="color:red">{{current_date}}</h1></body></html>')
    # t=get_template('current_datetime.html')  上面的写法可以将参数写在html文件中,然后以加载文件的方式生成模板,效率高,又进行了分离
    c=Context({'current_date':now})
    html=t.render(c)
    return HttpResponse(html)

#另一种写法(推荐)
def current_time(req):
    now=datetime.datetime.now()
    return render(req, 'current_datetime.html', {'current_date':now})

前面的例子 context 传递的简单参数值主要是字符串,然而,模板系统能够非常简洁地处理更加复杂的数据结构,例如list、dictionary和自定义的对象。

模板中万能的句点号:替换变量{{ 变量名 }}

列表,views中最后render的Context参数:{“list”:[111,222,333]},在模板中{{ list.2 }}返回列表的第三项
字典,views中最后render的Context参数:{“dict”:{“a”:111,“b”:222}},在模板中{{ list.a }}返回字典的a键的值
对象,views中最后render的Context参数:{“obj”:times},times = datetime.datetime.now(),在模板中可以使用句点号返回时间的属性,如{{ obj.year }}返回年

# app01项目下的urls.py
from django.urls import path,re_path,include
from app01 import views,views_app01
urlpatterns = [
    path('new/story/',views.app_story),
    path('login/',views_app01.login),
    path('index/',views_app01.index),

]

# app01项目下的views_app01.py视图
from django.shortcuts import render
from pathlib import Path
import datetime

def index(req):
    class Person:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    p1 = Person('张三',32)
    times = datetime.datetime.now()
    return render(req,"index.html",{"obj1":times,"obj2":p1})
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ obj1 }}------{{ obj1.year }}</h1>
<hr>
<h1>{{ obj2.name }}==>{{ obj2.age }}</h1>
<br>
{{ obj2 }}
</body>
</html>

 模板中的语句

if语句:
{% if %} 
{% elif %}
{% else %}
{% endif %}

for语句:
{% for item in obj %}
obj是列表,item是每项的值,想要取得索引,使用{{ forloop.counter }},默认counter是从1开始的

obj3=["a","b","c"]

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% for item in obj3 %}
    {{ forloop.counter }}===>{{ item }}<br>
{% endfor %}
<hr>
{% for item in obj3 %}
    {{ forloop.counter0 }}===>{{ item }}<br>
{% endfor %}
<hr>
{% for item in obj3 %}
    {{ forloop.revcounter }}===>{{ item }}<br>
{% endfor %}
<hr>
{% for item in obj3 %}
    {{ forloop.revcounter0 }}===>{{ item }}<br>
{% endfor %}
</body>
</html>

 

 如果obj3是字典,遍历的是Key,想要值需要使用句点号。

模板中的过滤器filter:使用管道符|

后台obj=“hello”

模板{{ obj | upper }}即可将小写变大写。lower、first 、capfirst、default等等。

   # 1  add          :   给变量加上相应的值
   # 2  addslashes   :    给变量中的引号前加上斜线
   # 3  capfirst     :    首字母大写
   # 4  cut          :   从字符串中移除指定的字符
   # 5  date         :   格式化日期字符串
   # 6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值
   # 7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值

#value1="abcDe"
{{ value1|upper }}<br>   #全部转换为大写ABCDE
#value2=5
{{ value2|add:3 }}<br>   #5+3=8
#value3='he  llo wo r ld'   
{{ value3|cut:' ' }}<br>   #去掉空格helloworld
#import datetime
#value4=datetime.datetime.now()
{{ value4|date:'Y-m-d' }}<br>   #格式化日期
#value5=[]
{{ value5|default:'空的' }}<br>   #如果为空,就输出default后的值
#value6='<a href="#">跳转</a>'
{{ value6 }}                   #整体作为字符串<a href="#">跳转</a>
{% autoescape off %}
  {{ value6 }}                 #字符串作为html代码,即作为了标签<a>
{% endautoescape %}
{{ value6|safe }}<br>         #等同于上面,作为标签<a>
{{ value6|striptags }}
#value7='1234'
{{ value7|filesizeformat }}<br>   #将1234作为数字换算为KB或MB等表示
{{ value7|first }}<br>        #第一个字符
{{ value7|length }}<br>       #长度
{{ value7|slice:":-1" }}<br>  #切片
#value8='http://www.baidu.com/?a=1&b=3'   #转换为urlencode编码,http%3A//www.baidu.com/%3Fa%3D1%26b%3D3
{{ value8|urlencode }}<br>
#    value9='hello I am yuan'
{{ value9|truncatechars:'6'  }}<br>  #按字符进行截取
{{ value9|truncatewords:'2' }}          #按字(单词)进行截取

{% csrf_token %}:

当form表单提交的时候,如果中间件,即在settings.py中的MIDDLEWARE中,'django.middleware.csrf.CsrfViewMiddleware',没有被禁用,form提交后页面会出现Forbidden错误

 在form表单中增加{% csrf_token %}:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>欢迎登陆!!</h1>

    <form action="/app01/login/" method="post">
        <input type="text" name="username">
        <input type="text" name="pass">
        <input type="submit" value="submit">
        {% csrf_token %}
    </form>

</body>
</html>

 渲染模板时,会自动生成一个input标签,type为hidden,value是一个随机的长字符串,这个键值对会被后台保存,在前端submit提交时会一同提交,后台(实际上应该是中间件django.middleware.csrf.CsrfViewMiddleware)获取并进行比较,一致就认为是安全的。生成的csrf_token标签,用于防治跨站攻击验证。注意如果在view的index里用的是render_to_response方法,不会生效。

{% url %}:  引用路由配置的地址,{% url  "name的值" %},这里name的值就是urls中每个路由的name参数的值,如path(“login/”,views.login,name="abc"),这时,模板中{% url "abc"%}

{% with %}:用更简单的变量名替代复杂的变量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}

{% verbatim %}: 禁止render,即禁止渲染
{% verbatim %}
         {{ hello }}
{% endverbatim %}

在渲染后的结果是显示{{ hello }}本身。

{% load %}: 加载标签库

学习这个之前,要了解自定义标签和过滤器

自定义filter和simple_tag:

1)、在app中创建templatetags模块(必须的)
2)、创建任意 .py 文件,如:my_tags.py

需要注意的是自定义标签不能使用在if语句的条件中,而过滤器可以。使用自定义标签和过滤器,必须在文件第一行使用{% load mytag%}引入相应模块,即相应的py文件。 

extend模板继承:

问题的提出:多个页面,大部分内容相同,如下,只有中间右半部分内容有差异

<!--caidan1.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .page-top{
            height: 50px;
            background-color: rosybrown;

        }
        .page-body .menu{
            height: 300px;
            background-color: green;
            float: left;
            width: 20%;
        }
        .page-body .content{
            height: 300px;
            background-color: palegoldenrod;
            float: left;
            width: 80%;
        }
        .page-footer{
            height: 30px;
            background-color: yellow;
            clear: both;
        }
    </style>
</head>
<body>
<div class="page-top">页头部分</div>
<div class="page-body">
    <div class="menu">
        <a href="/app01/caidan1/">菜单一</a><br>
        <a href="/app01/caidan2/">菜单二</a>
    </div>
    <div class="content">
        菜单一内容部分
    </div>
</div>
<div class="page-footer">页脚部分</div>
</body>
</html>


<!--caidan2.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .page-top{
            height: 50px;
            background-color: rosybrown;

        }
        .page-body .menu{
            height: 300px;
            background-color: green;
            float: left;
            width: 20%;
        }
        .page-body .content{
            height: 300px;
            background-color: palegoldenrod;
            float: left;
            width: 80%;
        }
        .page-footer{
            height: 30px;
            background-color: yellow;
            clear: both;
        }
    </style>
</head>
<body>
<div class="page-top">页头部分</div>
<div class="page-body">
    <div class="menu">
        <a href="/app01/caidan1/">菜单一</a><br>
        <a href="/app01/caidan2/">菜单二</a>
    </div>
    <div class="content">
        菜单二内容部分
    </div>
</div>
<div class="page-footer">页脚部分</div>
</body>
</html>
# urls.py
from django.contrib import admin
from django.urls import path,re_path,include
from app01 import views,views_app01
urlpatterns = [
    path('new/story/',views.app_story),
    path('login/',views_app01.login),
    path('index/',views_app01.index),
    path('caidan1/',views_app01.caidan1),
    path('caidan2/',views_app01.caidan2),

]

# views_app01.py
from django.shortcuts import render,HttpResponse,redirect,reverse
from pathlib import Path

def caidan1(req):
    return render(req,"caidan1.html")

def caidan2(req):
    return render(req,"caidan2.html")

caidan1.html和caidan2.html代码有大量的重复,解决的方法是将重复部分抽取,写在一个公共的模板上,不同的部分使用{% block 名称%}取代:

<!-- base.html 公共的模板-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .page-top{
            height: 50px;
            background-color: rosybrown;

        }
        .page-body .menu{
            height: 300px;
            background-color: green;
            float: left;
            width: 20%;
        }
        .page-body .content{
            height: 300px;
            background-color: palegoldenrod;
            float: left;
            width: 80%;
        }
        .page-footer{
            height: 30px;
            background-color: yellow;
            clear: both;
        }
    </style>
</head>
<body>
<div class="page-top">页头部分</div>
<div class="page-body">
    <div class="menu">
        <a href="/app01/caidan1/">菜单一</a><br>
        <a href="/app01/caidan2/">菜单二</a>
    </div>
    {% block content %}
    {% endblock %}
</div>
<div class="page-footer">页脚部分</div>
</body>
</html>

<!-- caidan1.html -->
{% extends "base.html" %}
{% block content %}
    <div class="content">
        菜单一内容部分
    </div>
{% endblock %}

<!-- caidan2.html -->
{% extends "base.html" %}
{% block content %}
    <div class="content">
        菜单二内容部分
    </div>
{% endblock %}

公共部分的内容只写一份放在base.html中,在caidan1.html和caidan2.html中通过{% extend %}引入母版,将不同的部分用{% block %} {% endblock%}包围起来,以进行替换。

解决该问题的传统做法是使用 服务器端的 includes ,你可以在 HTML 页面中使用该指令将一个网页嵌入到另一个中。 事实上, Django 通过 {% include %} 支持了这种方法。 但是 Django 解决此类问题的首选方法是使用更加优雅的策略,即上面说的—— 模板继承 。

本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。要比include方法灵活。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python入门自学进阶-Web框架——4、HttpRequest和HttpResponse及模板 的相关文章

  • 06异常处理

    python的异常处理 python使用try except xff0c 可使程序不因为运行错误而崩溃 结构如下 xff1a try span class hljs tag lt span class hljs title body spa
  • 07turtle库的进阶使用

    turtle库的进阶使用 turtle库以屏幕中心为绘制原点利用代码绘制一棵树 span class hljs keyword import span turtle span class hljs string 34 34 34 plist
  • 结束,也是开始

    结束 xff0c 也是开始 序言 看到CSDN征文要求 xff0c 感觉非常适合自己 四年前的自己正在参加高考 xff0c 转眼四年过去了 xff0c 自己也即将步入社会 xff0c 四年的大学生活感慨颇多 xff0c 谨以此文作为自己的阶
  • 01策略模式

    策略模式 最近在看 Head First设计模式 这本书 xff0c 最大的感触就是 xff0c 原来写代码也是有 套路 的 xff0c 刚学了策略模式 xff0c 用C 43 43 实现了一下 xff0c 做个笔记 xff0c 备忘 xf
  • 1、STM32CubeMX和STM32Cube库(HAL)详细介绍

    目录 前言 STM32Cube生态 STM32Cube 是什么 xff1f STM32Cube 软件工具套件 STM32Cube Embedded 软件 STM32CubeMX 编辑 前言 也许大家在学习正点原子或者其他32视频和代码的时候
  • 安卓SATA自动挂载实例

    平台 xff1a IMX6 OS 安卓4 2和安卓4 4 查看挂载log信息 xff1a logcat s Vold MountService 手动挂载 xff1a mount t ntfs dev block mnt mount t v
  • linux驱动开发 - 12_platform 平台驱动模型

    文章目录 platform 平台驱动模型1 platform 总线platform匹配过程 2 platform 驱动platform 驱动框架如下所示 xff1a 3 platform 设备platform 设备信息框架如下所示 xff1
  • 多旋翼飞行器设计与控制(二):基本组成

    一 前言核心问题 二 总体介绍多旋翼系统内部布局 三 机架机身起落架涵道 四 动力系统概述螺旋桨电机电调电池 五 指挥控制系统遥控器和接收器自动驾驶仪地面站数传 一 前言 核心问题 xff08 1 xff09 多旋翼组成结构 机架动力系统控
  • 多旋翼飞行器设计与控制(三):机架设计

    一 布局设计机身基本布局旋翼的安装旋翼和机体半径 xff1a 尺寸和机动性关系 xff1a 重心位置 xff1a 自驾仪安装位置 xff1a 气动布局 xff1a 二 结构设计机体基本设计原则减振设计减噪设计 一 布局设计 机身基本布局 交
  • SLAM学习——使用ARUCO_marker进行AR投影

    一 简介 1 1 目标 增强现实技术 xff08 Augmented Reality xff0c 简称 AR xff09 xff0c 是一种实时地计算摄影机影像的位置及角度并加上相应图像 视频 3D模型的技术 xff0c 这种技术的目标是在
  • k8s安装Prometheus

    注 xff1a 必须要先搭建网页管理容器 xff1b k8s部署dashboard kali yao的博客 CSDN博客 1 Prometheus的概述 Prometheus是一个最初在SoundCloud上构建的开源监控系统 它现在是一个
  • Logstash完成ELK集群

    注 xff1a 本文与同步 9条消息 搭建Elasticsearch和kibana完成初步ELK日志分析平台搭建 kali yao的博客 CSDN博客 logstash搭建 1 logstash介绍 什么是logstash 是一个数据采集
  • SQL基本语句及用法

    目录 一 基本SQL语句用法及概述 1 常用MySQL命令 2 语法规范 3 SQL语句分类 二 数据查询语言 1 基础查询 1 xff09 查询的字段列表可以是字段 常量 表达式 函数等 2 xff09 使用别名 xff0c 字段名和别名
  • PyCharm 社区版 安装 教程(Windows)

    注 xff1a 如果已经安装过python 3 5 及以上版本的解释执行器则跳过此步骤 下载 PyCharm 社区版 软件 PyCharm windows 版本 安装包如下 Thank you for downloading PyCharm
  • 监控zabbix面试题

    目录 1 我们可以用zabbix监控哪些 2 zabbix的主动监控与被动监控 3 Zabbix监控做过哪些 4 zabbix监控mysql的四大性能指标 5 配置zabbix自定义监控流程 6 安全组是什么 xff0c 限制了3306的入
  • 【ros学习】12.ros启动gazebo时摄像头的发布进程被杀死,导致rqt_image_view无法显示画面

    ros启动gazebo时摄像头的发布进程被杀死 xff0c 导致rqt image view即使订阅了正确的话题也无法显示画面 原因是gazebo的版本过低 xff0c 与Rviz不兼容 ubuntu16 04匹配的ros版本是kineti
  • 系统运维面试题

    目录 1 什么是运维 什么是游戏运维 2 在工作中 xff0c 运维人员经常需要跟运营人员打交道 xff0c 请问运营人员是做什么工作的 xff1f 3 请描述下linux 系统的开机启动过程 4 为什么连接的时候是三次握手 xff0c 关
  • Xshell的使用

    本文修改于 xff1a 高效使用XSHELL 简书 jianshu com https www jianshu com p 67b83d3f2e40 一 XShell的概述 1 XSHELL是什么 Xshell是用于Windows平台的功能
  • linux下解压rar和7z压缩文件

    在windows下我们压缩解压文件通常后缀为rar xff0c 在linux下我们压缩解压文件通常后缀为tar 默认在linux下我们不能解压压缩rar文件 我们可以下载rarlinux安装包实现解压压缩后缀为rar的包 下载地址 xff1
  • Filebeat输出json格式的日志并指定message字段的值

    目录 1 开启json格式所需的字段概述 2 配置示例 3 如果问题没有解决可点击官网 1 开启json格式所需的字段概述 filebeat配置input要有以下字段 json keys under root true json overw

随机推荐

  • Prometheus添加邮件告警和企业微信机器人告警

    我们将在 Prometheus 服务器上编写警报规则 xff0c 这些规则将使用我们收集的指标并在指定的阈值或标准上触发警报 xff0c 收到警报后 xff0c Alertmanager 会处理警报并根据其标签进行路由 一旦路径确定 xff
  • 麒麟ARM64制作nginx,java,php,node基础镜像

    一 环境准备 1 网上搜底层镜像 麒麟容器基础镜像 xff1a docker search kylin 镜像准备 docker pull kylin 注 xff1a 最好自己制作底层镜像 2 自己做底层镜像 注 xff1a 做镜像时需要在麒
  • docker部署简易Prometheus

    注 xff1a 部署前可以先系统的学习一下 xff1a Introduction Prometheus中文技术文档 在之后需要书写自定义告警的 xff0c 需要在学习一下PromQL语言 xff0c 一般网上也能搜到 xff0c 可以在安装
  • k8s面试题-进阶

    1 简述etcd及其特点 etcd是CoreOS团队发起的开源项目 xff0c 是一个管理配置信息和服务发现 xff08 service discovery xff09 的项目 xff0c 它的目标是构建一个高可用的分布式键值 xff08
  • 制作Alpine Linux镜像报错errors: 15 distinct packages available

    1 执行报错 执行docker build t 镜像 版本 f Dockerfile 报错 xff1a 2 查看网上的解决思路 网上文档解决思路 xff1a 这边我做了一下改变把这些写入了dockerfile 加了几个RUN RUN rm
  • C++ class与struct的区别

    在C语言中 xff0c struct是作为数据类型存在的 xff0c 因此其中只能包含变量 xff0c 不可以包含函数 xff0c 结构相对简单 而C 43 43 采用OOP编程思想 xff0c 为struct扩充了很多属性 xff0c 使
  • 【ros学习】13.URDF机器人建模详解

    一 URDF简介 URDF xff08 Unified Robot Description Format xff09 统一机器人描述格式 xff0c URDF使用XML格式描述机器人文件 URDF语法规范 xff0c 参考链接 xff1a
  • 如何强制“git pull”覆盖本地文件?

    问题描述 xff1a 如何强制覆盖 git pull 上的本地文件 xff1f 我的本地存储库包含一个文件名与服务器上相同的文件 错误 xff1a 未跟踪的工作树文件 example txt 将被合并覆盖 解决方案1 huntsbot co
  • 如何克隆特定的 Git 分支? [复制]

    问 xff1a 这个问题在这里已经有了答案 xff1a How do I clone a single branch in Git 26 个回答 8 年前关闭 Git clone 会将远程分支克隆到本地 有没有什么方法可以自己克隆一个特定的
  • tensorflow报错:InvalidArgumentError: Assign requires shapes of both tensors to match. lhs shape= [12]

    tensorflow报错 xff1a InvalidArgumentError Assign requires shapes of both tensors to match lhs shape 61 12 rhs shape 61 6 我
  • opencv矩形轮廓查找

    之前公司软件版本是在通过调用摄像头再手动圈定仪器数字区域进行识别 xff0c 现在在此基础上实现自动定位 xff0c 检测出所有的矩形通过其宽高之比和面积进行筛选 xff0c 部分关键代码如下 自动定位数字区域 include lt ope
  • Nginx部署多个Vue项目,配置不同域名

    文章目录 一 前言二 上传dist文件三 配置nginx cnf四 域名解析 一 前言 一个服务器需要部署多个前端项目 比如需要一个企业官网比如需要一个管理系统 这时候一个Nginx要怎么配置多个前端项目呢本文详细讲解 xff1a 通过不同
  • ESP32-C3入门教程 问题篇⑫——undefined reference to rom_temp_to_power, in function phy_get_romfunc_addr

    文章目录 一 前言 二 发现问题 三 解决问题 一 前言 本文基于VS Code IDE进行编程 编译 下载 运行等操作 基础入门章节请查阅 ESP32 C3入门教程 基础篇 基于VS Code构建Hello World 教程目录大纲请查阅
  • USART RX 不上拉的后果

    这两天写一个STM32的程序 xff0c 其中USART1是要接一个串口屏做显示的 xff0c 调试前期是还没用到显屏 xff0c 就拿USART1做log打印 然后就发现了一个很怪异的现象 USART1串口转usb接到电脑 xff0c 程
  • 虚拟机ros系统安装

    一 新建虚拟机 1 这里选择自定义安装 这里为了灵活性一般使用稍后安装 红款内根据自己情况选择安装路径 这一步一定要选择IDE否则开机 会报错 这里默认20g就够用 点击完成虚拟机就安装完成了 二安装ros系统 点击这个光驱安装镜像 把镜像
  • 用python实现realsenseD435i相机实现视频显示,并按空格键执行拍照,保存照片的程序

    为了使用Intel RealSense D435i相机 xff0c 我们需要安装pyrealsense2库 你可以通过以下命令安装它 xff1a pip install pyrealsense2 下面是一个使用pyrealsense2库实现
  • 二元信号量、互斥量和临界区之间的区别

    二元信号量 适合只能被唯一一个线程独占访问的资源 多元信号量 适合允许多个线程并发访问的资源 互斥量 和二元信号量类似 xff0c 资源仅同时允许一个线程访问 xff0c 但和信号量不同的是 xff0c 信号量在整个系统可以被任意线程获取并
  • ROS摄像机的标定

    本文主要为ROS camera calibration 单目相机标定教程的翻译 原文 xff1a http wiki ros org camera calibration Tutorials MonocularCalibration 仅供英
  • <视觉>——单目相机的标定(简单原理+Opencv实现)

    单目相机的标定原理大致如下 xff1a 世界坐标到像素坐标的转换 期间的参数有S尺度因子 xff0c 内参矩阵K xff0c 旋转矩阵R xff0c 平移矩阵T xff0c 一共八个未知数 在Opencv中我们可以方便的根据相机拍摄不同位姿
  • Python入门自学进阶-Web框架——4、HttpRequest和HttpResponse及模板

    HTTP请求中产生两个核心的对象 xff1a http请求 xff1a HttpRequest对象 http响应 xff1a HttpResponse对象 所在位置django http xff0c 前边用的reques就是HttpRequ