Django
2018-04-11 14:07:31 0 举报仅支持查看
AI智能生成
Django 学习资料整理,如有问题请指教
模版推荐
作者其他创作
大纲/内容
MVC框架和MTV框架
MVC(<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">Model View Controlle</span>)
模型(<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">Model</span>)<br>
视图(View)<br>
控制器(Controller)
优点<br>
耦合性低
重用性高
生命周期成本低<br>
MVT(<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">Model View Tamplate</span>)
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">Model(模型)</span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">负责业务对象与数据库对象(ORM)</span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">Template(模板)</span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">负责如何把页面展示给用户</span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">View(视图)</span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">负责业务逻辑,并在适当的时候调用Model和Template</span>
MVC框架和MTV框架的区别
传统的MVC框架中的Controller,在MTV框架中该模块合并了urls.py、views.py两个模块<br>
MTV 的View视图为Templates<br>
视图
作用<br>
处理业务逻辑
参数
必须接收一个request默认参数<br>
FBV
把视图写成一个函数
CBV
把视图写成一个类<br>
FBV与CBV如何区分请求格式
FBV
if request.mentond=="GET"<br>
CBV<br>
<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">#从view 模块中导入一个View 类,然后在类中定义两个方法</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">from django.views import View</div><div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">class Login(View)</div><div style="white-space: pre-wrap; text-align: left; text-indent: 28px; line-height: 1.75; font-size: 14px;">def get(self,request):</div><div style="white-space: pre-wrap; text-align: left; text-indent: 56px; line-height: 1.75; font-size: 14px;">pass</div><div style="white-space: pre-wrap; text-align: left; text-indent: 28px; line-height: 1.75; font-size: 14px;">def post(self,request):</div><div style="white-space: pre-wrap; text-align: left; text-indent: 56px; line-height: 1.75; font-size: 14px;">pass</div>
as_view
子主题
select 、checkbox <br>
多选后,在后台都是字典形式:键为=input框name值,值为一个列表,包含checkbox的值
注意:多个checkbox的name名字一致
<QueryDict: {'name1': [''], 'name2': [''], 'num1': ['1', '2'], 'num2': ['点我3', '点我4']}>
request.body
字节类型
获取文件的两种方式
request.body
request.FIELS
FORM 上传文件
后台获取的值也是键值对方式<br>
键:input框的name,值:
页面加enctype
后台获取<br>
request.FILES("name").name<br>
JsonResponse对象<br>
作用<br>
返回一个json类型的数据
是HttpRespons的子类<br>
专门生成JSON编码响应
缺点
只能传一个字典
如何可以传列表
safe = False<br>
JsonResponse(data,safe=False)
做一个安全性的检测<br>
Request对象<br>
概念<br>
Django 将请求行、头,内容信息封装成,HTTPRequest中的属性除了说明类的都是只读,不可修改<br>
属性
请求相关<br>
request.method
一个字符串,表示请求方法
如"GET""POST",必须大写
request.POST
把后端form表单的东西统计打包成字典格式
request.GET
以"GET"方式访问时,获取?号后面的数据,字典形式<br>
<QueryDict: {'ASDF': ['SDFDS']}>
<pre><span style="color: #800080">2</span><span style="color: #000000">.HttpRequest.path</span></pre>
<pre><span style="color: #000000">一个字符串,表示请求的路径组件(不含域名)。</span></pre>
注意:只会获取路径,不包含参数
<pre><span style="color: #000000">HttpRequest.FILES</span></pre>
注意<br>
files:输入框必须填写name,否则后端接收不到数据<br>
request.FILES
后端查看数据使用
request.FILES["file2"].name
获取数据
写数据
for i in request.FILES["file2"].chunks():
加chunks
cookie
request.cookies
<pre><span style="color: #000000">一个标准的Python 字典,包含所有的cookie。键和值都为字符串。</span></pre>
<pre><span style="color: #000000">HttpRequest.session</span></pre>
<pre><span style="color: #000000">一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。完整的细节参见会话的文档。</span></pre>
其他
<pre>0.HttpRequest.scheme</pre>
请求方案的字符串,通常为http、https
<pre><span style="color: #800080">1</span><span style="color: #000000">.HttpRequest.body</span></pre>
<pre><span style="color: #000000">在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等</span></pre>
request.body<br>
前端输入框,输入姓名密码<br>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATgAAABDCAIAAACHj46LAAAFN0lEQVR4nO2dPW7jOhRGua3s4xWaDWQDGsBdZgHPcCNkBQZeETeqDBhIMZUbdQI0RVq50VTZAV8hWZb4I1HyJeMbfge3CBzJpMh7RIpUZoQk43gQz3/ovm6Cv7unw3H2qI/fT+JlVKXjQYiX5/kz78GtbgBc+di9Pu3+zh0l6Ao8HoT4NYgX8fT7g+7rRwW53BGOByFeBk3w51nx1gfh7laAK8fnX4opYUV9PD52r4PmeN15uW0AEIBvLSoA3wWICgADICoADICoADAAogLAAIgKAAMgKgAMgKgAMACiAsCAu0QVQgghfvw8IBDGoEpTAFERHoMqTQFERXgMqjQFEBXhMajSFEBUhMegSlMAUREegypNAURFeAyqNAWBRE3SU95IKWWxf/vy7EGQhEufUqQokDKcqNvq0p7TVJsUrn6HcOnTe9MTXCEQNUnP+ftptl83759SSinrDKLeL0l6ysvQtzy90Nk+vT9BQQuBqFLKi4OoXb8yH1H7+d6V0PedZF93JQdsyYlCp/v0nuwCQwhEzRtXUbPS9cjHjDZf+0eyL3zwzsoveIgwFjrdpyQ5CmRIUbkPp0l6LrS5Q/vhgzgTvtDZPiXKUhBK1KyUsjyHzCryUIbT0aXJz3wbnagufUqTpCDw1Jd1dM9pprlfnKK6BEmOAvmAohrXkJP0XHgekJP0XEz61u1GmEXtlpRuOxZWaJSGqLFBKWpW3n61Qt1+aXF47i31NVG1BVhrudddhJaRKmO1ul8NP5xeKOqOXHsTGVdMTqwhD9u22L8ZnXFsENpCIWoYqEQ9581gOXRbXda5al6wOeWNKoN+pNEZ/dz2dqDXLdnXraj9AonLQtFwOF1xpcqX93WYPrLzRznXoUHIC4WowaARVWojz+b9c8U0r/XKSdR9bRpSzsX4Q+OCh7FuXb6+133pXbLaR0tjirteqfm2ci7GLdldu3G+rfs21yDkhULUYBCJqs9Lt9Vl+QbjMlHnhjI9BQfnqp/b1oomTaN520F5sh05Y5mbmEVdUh+SQiFqMHwtJq2b/S4Q9fY8Zh3Tbu/TmFBLWTI8JtvqYkrZRYtJ+iUYBreJPSF16jvfIOSFQtRgeBPV9LRJKKqWdlIfT2wJZ7faSVTjJHNpdPPqcZ11Z2xPEDZnZhrET6EQNQBcR1RjcVJZTfEgarKvDfP8fb10km/cfbUMbmucMTaI70Ihqj+8ibpEkqWi2v52RHlOW3SzcBHVaOmPn4esXLakdB33zCOe/rg4Owt1aRDyQiFqSIgWkyZfA1icwcrjqGGb4TTcDRofOSrUVo2sNM6T5154MM42F67iuDjTv/Ux1SCKqHMNQl4oRA0J2fbMsF/bLfV1f1OinJtsq0tTF9oySbutN5ro2rdb9SUcy1LwlKjD3X+N5bekdqFrUNv++4v9W7KtcsumdPsG1aW5HezeIOSFQtRgUIhaVpv0bfy+y137FiMlmmqTnvJGVSgrpSzrYlwf2yzX+c2kG5aX7y2sWltSFqVHb3eZXmYYtm1WqjV0bBDaQiFqMPCPmyE8BlWaAoiK8BhUaQogaqTx37//tKH8TBtUaQogauzhw88+qNIUQNTYA6KyAKLGHhCVBRA19oCoLICosQdEZQFEjT0gKgsgauwBUVkAUWMPiMoCiBp7QFQW3CUq+Aa0/80XeHDQSbEDUVmAToodiMoCdFLsQFQWoJNiB6KyAJ0UKeKK8jN4TNA3ADAAogLAAIgKAAMgKgAMgKgAMACiAsAAiAoAAyAqAAyAqAAwAKICwID/AdJXWAlXoIIUAAAAAElFTkSuQmCCAA==" alt="">
request.encoding
一个字符串,表示提交的数据编码格式,默认“utf8”<br>
<pre><span style="color: #000000">HttpRequest.META</span></pre>
<pre><span style="color: #000000">标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器</span></pre>
方法
request.get_host()
获取地址和端口<br>
request.get_full_path()
<pre><span style="color: #000000">HttpRequest.get_full_path()</span></pre>
<pre><span style="color: #000000">返回 path,如果可以将加上查询字符串。例如:</span><span style="color: #800000">"</span><span style="color: #800000">/music/bands/the_beatles/?print=true</span><span style="color: #800000">"</span></pre>
<pre>HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt=<span style="color: #800000">''</span>, max_age=<span style="color: #000000">None)</span></pre>
<pre><span style="color: #000000">返回签名过的Cookie 对应的值,签名不再合法则返回django.core.signing.BadSignature。default 不会引发异常并返回default 的值。<br>salt 对安全密钥强力攻击提供额外的保护。max_age查Cookie对应的时间戳确保Cookie 的时间不会超过max_age 秒。</span></pre>
request.is_ajax()
<span style="color: #000000">如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串</span><span style="color: #800000">'</span><span style="color: #800000">XMLHttpRequest</span><span style="color: #800000">'</span><span style="color: #000000"></span>
Response对象
HttpRespons可以在视图函数中自定义返回的内容
存在模块<br>
django.http
返回字符串<br>
response= HttpRespons("hello ,world")<br>
response= HttpRespons("hello ,world",Conten_type="text/html")<br>
设置或删除响应头信息
response = HttpRespons()<br>response['Conten-Type'] = "text/html;charset=UTF-8"<br>#删除信息<br>del response["Conten-Type"]<br> <br>
属性<br>
<p>HttpResponse.content:响应内容</p><br><p>HttpResponse.charset:响应内容的编码</p><br><p>HttpResponse.status_code:响应的状态码</p>
Respons方法<br>
HttpRespons
render
redirect
JsonResponse
Django shortcut
render<br>
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
render(request, template_name[, context])
<pre>request: 用于生成响应的请求对象。</pre>
<pre>template_name:要使用的模板的完整名称,可选的参数</pre>
<pre>context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。</pre>
<pre>content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。</pre>
<pre>status:响应的状态码。默认为200。</pre>
<pre>例子</pre>
<pre><span style="color: #0000ff">def</span><span style="color: #000000"> my_view(request):<br> </span><span style="color: #008000">#</span><span style="color: #008000"> 视图的代码写在这里</span><br> <span style="color: #0000ff">return</span> render(request, <span style="color: #800000">'</span><span style="color: #800000">myapp/index.html</span><span style="color: #800000">'</span>, {<span style="color: #800000">'</span><span style="color: #800000">foo</span><span style="color: #800000">'</span>: <span style="color: #800000">'</span><span style="color: #800000">bar</span><span style="color: #800000">'</span>})</pre>
等价于<br>
<pre><span style="color: #0000ff">from</span> django.http <span style="color: #0000ff">import</span><span style="color: #000000"> HttpResponse<br></span><span style="color: #0000ff">from</span> django.template <span style="color: #0000ff">import</span><span style="color: #000000"> loader<br></span><span style="color: #0000ff">def</span><span style="color: #000000"> my_view(request):<br> </span><span style="color: #008000">#</span><span style="color: #008000"> 视图代码写在这里</span><br> t = loader.get_template(<span style="color: #800000">'</span><span style="color: #800000">myapp/index.html</span><span style="color: #800000">'</span><span style="color: #000000">)<br> c </span>= {<span style="color: #800000">'</span><span style="color: #800000">foo</span><span style="color: #800000">'</span>: <span style="color: #800000">'</span><span style="color: #800000">bar</span><span style="color: #800000">'</span><span style="color: #000000">}<br> </span><span style="color: #0000ff">return</span> HttpResponse(t.render(c, request))</pre>
<h3>redirect()</h3>
<ul class="simple"><li><span id="yiyi-101" class="yiyi-st">一个模型:将调用模型的<tt class="xref py py-meth docutils literal"><span class="pre">get_absolute_url()</span></tt> 函数</span></li><li><span id="yiyi-102" class="yiyi-st">一个视图,可以带有参数:将使用<tt class="xref py py-func docutils literal"><span class="pre">urlresolvers.reverse</span></tt> 来反向解析名称</span></li><li><span id="yiyi-103" class="yiyi-st">一个绝对的或相对的URL,将原封不动的作为重定向的位置。</span></li></ul>
<span id="yiyi-48" class="yiyi-st">默认返回一个临时的重定向;<span id="yiyi-49" class="yiyi-st">传递<tt class="docutils literal"><span class="pre">permanent=True</span></tt> 可以返回一个永久的重定向。</span></span>
<p>临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人。</p>
<p>A页面临时重定向到B页面,那搜索引擎收录的就是A页面。</p>
<p>A页面永久重定向到B页面,那搜索引擎收录的就是B页面。</p>
模板
语法
in
for
if elif endis<br>
forloop<br>
if forloop.last endif<br>
变量"."<br>
列表
list.0
表示索引第0个<br>
对象的方法
object.function
对象.方法:执行对象的方法<br>
filter
default
{{ value|default:"name" }}
查询长度<br>
{{ value|length }}
<strong><span class="pre"><span class="pre"><span class="pre"><span class="pre">filesizeformat</span></span></span></span></strong>
<span class="pre"><span class="pre"><span class="pre"><span class="pre">将值格式化为一个 “人类可读的” 文件尺寸,byte类型</span></span></span></span>
<strong><span class="pre"><span class="pre"><span class="pre"><span class="pre">slice</span></span></span></span></strong>
切片
<strong><span class="pre"><span class="pre"><span class="pre"><span class="pre">date</span></span></span></span></strong>
<pre>{{ value|date:"Y-m-d H:i:s"}}</pre>
<strong>safe</strong>
<pre>{{ value|safe}}</pre>
禁止转义
<h3><strong>truncatechars</strong></h3>
指定的字符数量,那么会被截断。<span id="yiyi-509" class="yiyi-st">截断的字符串将以可翻译的省略号序列(“...”)结尾。</span><span class="yiyi-st">参数:截断的字符数</span>
<pre>{{ value|truncatechars:9}}</pre>
<h3><strong>自定义filter</strong></h3>
<pre><span style="color: #0000ff">from</span> django <span style="color: #0000ff">import</span><span style="color: #000000"> template<br>register </span>=<span style="color: #000000"> template.Library()<br><br>@register.filter(name</span>=<span style="color: #800000">"</span><span style="color: #800000">cut</span><span style="color: #800000">"</span><span style="color: #000000">)<br></span><span style="color: #0000ff">def</span><span style="color: #000000"> cut(value, arg):<br> </span><span style="color: #0000ff">return</span> value.replace(arg, <span style="color: #800000">""</span><span style="color: #000000">)<br><br>@register.filter(name</span>=<span style="color: #800000">"</span><span style="color: #800000">addSB</span><span style="color: #800000">"</span><span style="color: #000000">)<br></span><span style="color: #0000ff">def</span><span style="color: #000000"> add_sb(value):<br> </span><span style="color: #0000ff">return</span> <span style="color: #800000">"</span><span style="color: #800000">{} SB</span><span style="color: #800000">"</span>.format(value)</pre>
使用自定义filter
<pre><span style="color: #000000">{# 先导入我们自定义filter那个文件 #}<br>{% load app01_filters %}<br>{# 使用我们自定义的filter #}<br>{{ somevariable|cut:"0" }}<br>{{ d.name|addSB }}</span></pre>
注意:<br>
filter和update一块使用,批量更新
使用get方式
<span style="color: #000000">obj </span>= models.Tb1.objects.get(<span style="color: #0000ff">id</span>=<span style="color: #800080">1</span><span style="color: #000000">)<br></span><pre><span style="color: #000000">obj.c1 </span>= <span style="color: #800000">'</span><span style="color: #800000">111</span><span style="color: #800000">'</span><span style="color: #000000"><br>obj.save()</span></pre>
locals
全局变量<br>
自定义模板语言
需要先注册
load <br>
导入<br>
with <br>
模板语言定义一个变量
with 变量 as 名<br>
<h3><strong>Tags</strong></h3>
for
属性<br>
<img src="data:image/png;base64,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" alt="">
<strong>for ... empty</strong>
<p><strong><code class="docutils literal"><span class="pre">if,elif和</span></code><code class="docutils literal"><span class="pre">else</span></code></strong></p>
<strong>可以只有if和else</strong>
<span style="background-color: #ffff00">if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。</span>
<p><strong><span style="background-color: #ffffff">with</span></strong></p><br>
定义一个中间变量
<pre><span style="color: #000000">{% with total=business.employees.count %}<br> {{ total }} employee{{ total|pluralize }}<br>{% endwith %}</span></pre>
<h2>母板</h2>
<h2>继承母板</h2>
<pre>{% extends <span style="color: #800000">'</span><span style="color: #800000">layouts.html</span><span style="color: #800000">'</span> %}</pre>
<h2>块(block)</h2>
<code>{% block xxx %}</code>来定义"块"
<h2>组件</h2>
<pre>{% include <span style="color: #800000">'</span><span style="color: #800000">navbar.html</span><span style="color: #800000">'</span> %}</pre>
<h2>静态文件相关</h2>
<div class="cnblogs_code"><br><pre><span style="color: #000000">{% load static %}<br></span><span style="color: #0000ff"><</span><span style="color: #800000">img </span><span style="color: #ff0000">src</span><span style="color: #0000ff">="{% static "</span><span style="color: #ff0000">images/hi.jpg" %}" alt</span><span style="color: #0000ff">="Hi!"</span> <span style="color: #0000ff">/></span></pre><br></div>
<h3>使用get_static_prefix</h3>
第一种
<div class="cnblogs_code"><span style="color: #000000">{% load static %}</span><br><span style="color: #000000"></span><span style="color: #0000ff"><</span><span style="color: #800000">img </span><span style="color: #ff0000">src</span><span style="color: #0000ff">="{% get_static_prefix %}images/hi.jpg"</span><span style="color: #ff0000"> alt</span><span style="color: #0000ff">="Hi!"</span> <span style="color: #0000ff">/></span></div>
第二种
<span style="color: #000000">{% load static %}<br></span><div class="cnblogs_code"><pre><span style="color: #000000">{% get_static_prefix as STATIC_PREFIX %}<br></span><span style="color: #0000ff"><</span><span style="color: #800000">img </span><span style="color: #ff0000">src</span><span style="color: #0000ff">="{{ STATIC_PREFIX }}images/hi.jpg"</span><span style="color: #ff0000"> alt</span><span style="color: #0000ff">="Hi!"</span> <span style="color: #0000ff">/></span><br><span style="color: #0000ff"><</span><span style="color: #800000">img </span><span style="color: #ff0000">src</span><span style="color: #0000ff">="{{ STATIC_PREFIX }}images/hi2.jpg"</span><span style="color: #ff0000"> alt</span><span style="color: #0000ff">="Hello!"</span> <span style="color: #0000ff">/></span></pre><br></div>
<h3>自定义simpletag</h3>
和自定义filter类似,只不过接收更灵活的参数。
<pre>@register.simple_tag(name=<span style="color: #800000">"</span><span style="color: #800000">plus</span><span style="color: #800000">"</span><span style="color: #000000">)<br></span><span style="color: #0000ff">def</span><span style="color: #000000"> plus(a, b, c):<br> </span><span style="color: #0000ff">return</span> <span style="color: #800000">"</span><span style="color: #800000">{} + {} + {}</span><span style="color: #800000">"</span>.format(a, b, c)</pre>
使用自定义simple tag
<span style="color: #000000">{% load app01_demo %}
</span><pre><span style="color: #000000">{# simple tag #}
{% plus "1" "2" "abc" %}</span></pre>
注意:
input框需要和lable 一组<br>
Model
创建步骤<br>
1、手动创建数据库
2、在app/models.py写类
该类的特点
必须继承models.Models
3、在Django seting.py 中配置mysql
4、在Django 项目文件夹下__init__.py<br>
import pymysql <br>
pymysql.install_as_MSQLdb()
5、数据库创建<br>
python manage.py check<br>
作用<br>
它能捕获全部常见的模型问题。
Python manage.py makemigration <br>
可以指定 models 名称<br>
python manage.py migrate<br>
数据库名的特点
自动生成的表名结合应用的名称(books)和模型名的小写形式
总结<br>
创建表的流程<br>
models.py--->Django翻译-->Pymysql-->MySQL(4p)<br>
子主题
字段
Charfield
默认不能为空<br>
Datetime<br>
<pre><span style="color: #000000">PositiveSmallIntegerField</span></pre>
正小整数
表操作
列表有索引越界查找,找不到指定索引报错
查<br>
get
get("name")
缺点<br>
查找数据不存在报错
.fileter
字典查询
user_dic = {"username:"alex","age":18"}<br>
User.object.fileter(**user_dic)#打散查找<br>
查询结果
列表对象,列表中包含对象
User.object.all()
获取对象的列表<br>
excutel
.first()<br>
为对象<br>
User object<br>
.last()
增加
如果表里面有数据,再增加数据<br>
两种选择<br>
1、给已存在的数据的,新字段,提供一个默认值
2、在models中修改,新字段的提供默认值<br>
create
创建数据并提交
<pre><span style="color: #000000">models.Tb1.objects.create(c1</span>=<span style="color: #800000">'</span><span style="color: #800000">xx</span><span style="color: #800000">'</span>, c2=<span style="color: #800000">'</span><span style="color: #800000">oo</span><span style="color: #800000">'</span>) </pre>
注意:从前端获取的字符串类型的数字,在添加数据的时候,django会自动转换成int类型<br>
User(username="ss",age=19) User.save()<br>
删<br>
delet
改
两种方式<br>
update()
obj = User.object.filter(name="age") obj.name = 'haha' obj.save()<br>
ORM
本质<br>
对象关系映射
类对应表的名
类的属性对应表的字段
类的对象对应表的一行数据
查询API<br>
查询结果Qureset<br>
values<br>
返回一个queryset:内部元素为字典类型<br>
models.Class.objects.values("cname","first_day")
<QuerSet [{"cname":"全栈八期",“first_day”:datetime.date(2017,10,17)}]>
distinct
使用values单列时,不能使用distinct<br>
values_list
返回一个queryset:内部元素为列表类型<br>
models.Class.objects.values("cname","first_day")
<QuerSet [("全栈八期",datetime.date(2017,10,17))]>
all
filter
values
orderby
exclude<br>
查询结果为数字
count
统计查询结果<br>
返回布尔值<br>
exists()
判断表里面有没有数据<br>
model.Class.objects.exists()
子主题
select (1) as "a" from "app01_class" limit 1;args = ()<br>
查询单个
get<br>
first
last
神奇的双下划线<br>
配合filter()做查询的
id__in=[1,2,3]
id__range=[1,2,3]
id_lt=12
id_gt=3
判断字段开头的<br>
name__contains
name_icontains
startwith
endswith
first_day__year='2018'
表关系<br>
一对一
创建方式两种
<pre>models.OneToOneField(to=<span style="color: #800000">"</span><span style="color: #800000">StudentDetail</span><span style="color: #800000">"</span>, null=<span style="color: #000000">True)</span></pre>
默认主键id
表关联:参数加上引号,为通过字符串进行映射
class Meta:<br>
Forringkey("表名",unique)<br>
正向查询
<pre><span style="color: #000000">student_obj.detail.email</span></pre>
.detail 为表名<br>
首先需要获取以对象
反向查询
<pre><span style="color: #000000;">detail_obj.student.sname</span></pre>
不需要使用表名_set,因为是一对一,不存在多条记录的数据<br>
一对多
存储外键数据两种方法
反向查找<br>
默认:表名_set
<p>注意:</p><br><p>如果不在外键的字段中设置related_name的话,默认就用表名_set。</p><br><p>如果设置了related_name="students",反向查询时可直接使用students进行反向查询。</p>
<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;"><span style="font-size: 30px; color: rgb(223, 64, 42);">filter :没有表名_set 方法</span></div>
GET有set 方法<br>
obj.student_set.all()
获取到所有的学生<br>
正向查找
注意
object.cid 获取到对象<br>
object.cid_id 获取到ID值<br>
多对多<br>
三种方式
通过外键创建
<pre><span style="color: #008000">#</span><span style="color: #008000"> 自定义第三张表,通过外键关联上面两张表</span>
<span style="color: #0000ff">class</span><span style="color: #000000"> Teacher2Class(models.Model):
teacher </span>= models.ForeignKey(to=<span style="color: #800000">"</span><span style="color: #800000">Teacher</span><span style="color: #800000">"</span><span style="color: #000000">)
the_class </span>= models.ForeignKey(to=<span style="color: #800000">"</span><span style="color: #800000">Class</span><span style="color: #800000">"</span><span style="color: #000000">)
</span><span style="color: #0000ff">class</span><span style="color: #000000"> Meta:
unique_together </span>= (<span style="color: #800000">"</span><span style="color: #800000">teacher</span><span style="color: #800000">"</span>, <span style="color: #800000">"</span><span style="color: #800000">the_class</span><span style="color: #800000">"</span>)</pre>
<h3>通过ManyToManyField创建</h3>
会自动创建第三张表
表名
当前表名+多对多字段的名字
<h3>通过外键和ManyToManyField创建</h3>
<span style="color: #0000ff">class</span><span style="color: #000000"> Class(models.Model):
</span><pre><span style="color: #000000"> id </span>= models.AutoField(primary_key=True) <span style="color: #008000">#</span><span style="color: #008000"> 主键</span>
cname = models.CharField(max_length=32) <span style="color: #008000">#</span><span style="color: #008000"> 班级名称</span>
first_day = models.DateField() <span style="color: #008000">#</span><span style="color: #008000"> 开班时间</span>
<span style="color: #0000ff">class</span><span style="color: #000000"> Teacher(models.Model):
tname </span>= models.CharField(max_length=32<span style="color: #000000">)
</span><span style="color: #008000">#</span><span style="color: #008000"> 通过ManyToManyField和手动创建第三张表</span>
cid = models.ManyToManyField(to=<span style="color: #800000">"</span><span style="color: #800000">Class</span><span style="color: #800000">"</span>, through=<span style="color: #800000">"</span><span style="color: #800000">Teacher2Class</span><span style="color: #800000">"</span>, through_fields=(<span style="color: #800000">"</span><span style="color: #800000">teacher</span><span style="color: #800000">"</span>, <span style="color: #800000">"</span><span style="color: #800000">the_class</span><span style="color: #800000">"</span><span style="color: #000000">))
</span><span style="color: #0000ff">class</span><span style="color: #000000"> Teacher2Class(models.Model):
teacher </span>= models.ForeignKey(to=<span style="color: #800000">"</span><span style="color: #800000">Teacher</span><span style="color: #800000">"</span><span style="color: #000000">)
the_class </span>= models.ForeignKey(to=<span style="color: #800000">"</span><span style="color: #800000">Class</span><span style="color: #800000">"</span><span style="color: #000000">)
</span><span style="color: #0000ff">class</span><span style="color: #000000"> Meta:
unique_together </span>= (<span style="color: #800000">"</span><span style="color: #800000">teacher</span><span style="color: #800000">"</span>, <span style="color: #800000">"</span><span style="color: #800000">the_class</span><span style="color: #800000">"</span>)</pre>
可以自己操作数据库<br>
正向查询
<pre>>>> teacher_obj =<span style="color: #000000"> models.Teacher.objects.first()<br></span>>>><span style="color: #000000"> teacher_obj.cid.all() # 查询该老师授课的所有班级<br></span><QuerySet [<Class: Class <span style="color: #0000ff">object</span>>, <Class: Class <span style="color: #0000ff">object</span>>]></pre>
反向查询
<pre>>>> class_obj =<span style="color: #000000"> models.Class.objects.first()
</span>>>><span style="color: #000000"> class_obj.teachers.all() # 此处用到的是related_name,如果不设置的话就用默认的表名_set
</span><QuerySet [<Teacher: Teacher <span style="color: #0000ff">object</span>>, <Teacher: Teacher <span style="color: #0000ff">object</span>>, <Teacher: Teacher <span style="color: #0000ff">object</span>>]></pre>
<h2>class RelatedManager</h2>
<strong>create()</strong>
返回新创建的对象
<strong>add()</strong>
<p>把指定的model</p>
<p>对象添加到关联对象集中。</p>
<p>添加对象</p>
<strong>remove()</strong>
从关联对象集中移除执行的model对象
<strong>clear()</strong>
从关联对象集中移除一切对象。
对于ForeignKey对象,这个方法仅在null=True时存在。
set()
更新model对象的关联对象
同理,对于ForeignKey对象,这个方法仅在null=True时存在。
<p><span style="background-color: #ffff00">注意:</span></p>
<ol><li>对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。</li></ol>
ORM常用方法
聚合<br>
AVG
是吧Qureset当做整体<br>
aggregate
是每个queryset每个对象象当作,个体<br>
给所有的字符串类型的值,加上名字
from django.db.models import Value <br>
Concat<br>
可以拼接字符串<br>
三总查询方式
像pymysql 一样,获取连接<br>
exatr
全部<br>
F Q <br>
F
档表里面有两个字段作比较<br>
将所有的字段的值在原来的基础上加上值<br>
待续<br>
Q
Q("小仙女")|Q("小魔女")<br>
执行其他语句<br>
extra
额外执行语句<br>
查询
select_realated
优化查询<br>
一对一
多对一
prefetch_related
多对多
一对多
正向查询
defer
排除某些字段<br>
插入数据<br>
bulk_create
批量插入<br>
get_or_create
update_or_create
in_bulk
和id__in 一样功能<br>
根据主键ID进行查找 <br>
时间字段
auto_now_add
创建这条数据<br>自动加上当前时间
auto_now <br>
每一次修改<br>都更新时间
关系字段<br>
related_name
to
to_field
Ajax
json
支持六种数据类型<br>
null:相当于js的None
子主题
如果字典中的键是单引号包装
转换成jison后变成双引号
json的本质<br>
只是把不是json字符串的转换成json字符串
s ='{"name"}'<br>
单引变双引<br>
<pre style="background-color:#ffffff;color:#000000;font-family:'Fira Code';font-size:12.0pt;">d = {<span style="color:#008080;font-weight:bold;">'name'</span>:<span style="color:#008080;font-weight:bold;">"alex"</span>}<br><span style="color:#000080;font-weight:bold;">import </span>json<br>s=json.dumps(d)<br><span style="color:#000080;">print</span>(s,<span style="color:#000080;">type</span>(s))</pre>
{"name": "alex"} <class 'str'>
特点
局部刷新
异步请求
上次请求的结果不影响这次的请求 <br>
Ajax本质
异步JavaScript发送请求
csrftoken
常用命令
django-admin startproject "project"<br>
python manage.py runserver IP:port<br>
STATIC_URL
别名:在HTML页面上使用的名称<br>
STATICFILES_DIRS(os.path.join(BASE_DIR,<span style="color:#008080;font-weight:bold;">'static'</span>),)此时的static 置放静态文件的文件名<br>
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">python manage.py startapp app01</pre>
URL路由系统<br>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">URL配置(URLconf)</span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">概念:</span><span style="margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; background-color: rgb(255, 255, 0);"></span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">它的本质是URL与要为该URL调用的视图函数之间的</span><span style="margin: 0px; padding: 0px; color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; background-color: rgb(255, 255, 0);">映射表。</span>
参数说明
正则表达式
正则表达式字符串
views视图函数
可调用对象
参数
视图函数
传递形式:字典
视图的参数指定默认值
别名
一个可选的name参数
什么情况下使用include
url数目多个,根据业务分组
多人协同开发
基本格式:<br>
2.0版本
<pre style="font-family: "Fira Mono", Consolas, Menlo, Monaco, "Courier New", Courier, monospace; font-size: 14px; white-space: pre-wrap; word-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-rendering: optimizeSpeed; color: rgb(12, 75, 51); margin: 15px 20px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span class="kn" style="color: rgb(0, 128, 0); font-weight: bold;">from</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">django.urls</span> <span class="k" style="color: rgb(0, 128, 0); font-weight: bold;">import</span> <span class="n">path</span><br><span class="kn" style="color: rgb(0, 128, 0); font-weight: bold;">from</span> <span class="nn" style="color: rgb(0, 0, 255); font-weight: bold;">.</span> <span class="k" style="color: rgb(0, 128, 0); font-weight: bold;">import</span> <span class="n">views</span><br><span class="n">urlpatterns</span> <span class="o" style="color: rgb(102, 102, 102);">=</span> <span class="p">[</span><span class="n">path</span><span class="p">(</span><span class="s1" style="color: rgb(186, 33, 33);">'articles/2003/'</span><span class="p">,</span> <span class="n">views</span><span class="o" style="color: rgb(102, 102, 102);">.</span><span class="n">special_case_2003</span><span class="p">),</span><span class="p"></span><span class="p">]</span></pre>
1.8版本<br>
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> django.conf.urls <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> url<br>urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [url(正则表达式, views视图函数,参数,别名),]</span></pre>
正则表达式注意事项
1、urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
2、若想捕获 URL 中的值,把值放在括号里。
3、无需使用前导斜线,因为每个URL 都有。每个 URL 本身就有。例如,是^reviews,而非^/reviews。
4、每个正则表达式字符串前面的'r' 是可选的,但是建议加上。它的作用是告诉 Python,那是“原始”字<br>符串,里面的一切内容都不应该转义。
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);">#</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"> 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项</span><br>APPEND_SLASH=True</pre>
URL配置搜索的范围
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">将url路径当作一个普通的Python 字符串</span>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">不包括GET和POST参数以及域名</span>
例如对http://www.example.com/myapp/ 的请求,URL 配置只查找myapp/;对http://www.example.<br>com/myapp/?page=3 的请求,URL 配置只查找myapp/。URL 配置不关心请求方法。也就是说,相同<br>URL 的所有请求方法(POST、GET、HEAD,等等)都交由同一个视图函数处理。
捕获的参数永远都是字符串
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。</span>
为视图的参数指定默认值
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^blog/$</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">, views.page),url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^blog/page(?P<num>[0-9]+)/$</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">, views.page),]<br></span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);">#</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"> views.py中,可以为num指定默认值</span><br><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">def</span> page(request, num=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">"</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">1</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">"</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">):</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">pass</span></pre>
具名分组
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">语法是</span><code style="margin: 0px 3px; padding: 1px 3px; background: rgb(221, 221, 221); border: 1px solid rgb(204, 204, 204); font-family: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace; word-wrap: break-word; font-size: 14px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">(?P<name>pattern)</code><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">,其中</span><code style="margin: 0px 3px; padding: 1px 3px; background: rgb(221, 221, 221); border: 1px solid rgb(204, 204, 204); font-family: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace; word-wrap: break-word; font-size: 14px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">name</code><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">是组的名称,</span><code style="margin: 0px 3px; padding: 1px 3px; background: rgb(221, 221, 221); border: 1px solid rgb(204, 204, 204); font-family: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace; word-wrap: break-word; font-size: 14px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">pattern</code><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">是要匹配的模式。</span>
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">, views.article_detail),]</span></pre>
不使用具名分组的弊端:
参数的顺序一一对应
性能
urlpatterns 中的每个正则表达式在首次访问时编译,因此系统的速度异常得快。旁注
错误处理
找不到匹配所请求 URL 的正则表达式或有异常抛出时,Django 会调用一个错误处理视图
•handler404<br>• handler500<br>• handler403<br>• handler400
可定制
引入其他 URL 配置
from django.conf.urls import include,url
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^blog/</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, include(<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">blog.urls</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>)),<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"></span>] <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);">#</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"> 可以包含其他的URLconfs文件</span></pre>
注意,这里的正则表达式没有$(匹配字符串末尾的符号),但是末尾有斜线
利用下面例子的功能,可以去除 URL 配置中的重<br>复,在多处使用相同的模式前缀。来看这个 URL 配置:
未改进<br>
urlpatterns = [<br>url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/history/$',views.history),<br>url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/edit/$',views.edit),<br>]
改进这个 URL 配置,把共用的路径前缀提取出来,再把不同的部分放在其后:<br>
urlpatterns = [<br>url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/',<br>include([<br> url(r'^history/$', views.history),<br> url(r'^edit/$', views.edit),<br> url(r'^discuss/$', views.discuss),<br> url(r'^permissions/$', views.permissions),<br> ])<br> ),<br>]
捕获的参数
被引入的 URL 配置会接收到父级 URL 配置捕获的参数
# settings/urls/main.py<br>from django.conf.urls import include, url<br> urlpatterns = [<br> url(r'^(?P<username>\w+)/reviews/', include('foo.urls.reviews')),<br>]#这里,捕获的"username" 变量能顺利传给被引入的 URL 配置<br><br># foo/urls/reviews.py<br>from django.conf.urls import url<br>from . import views<br>urlpatterns = [<br> url(r'^$', views.reviews.index),<br> url(r'^archive/$', views.reviews.archive),<br>]
捕获的参数都是字符串形式<br>
给视图函数传递额外参数
传递额外参数给视图函数
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> django.conf.urls <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> url<br></span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> . <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> views<br><br>urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [<br> url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^blog/(?P<year>[0-9]{4})/$</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, views.year_archive, {<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">foo</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>: <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">bar</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">}),<br>]</span></pre>
对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')对于/blog/2005/请求,Django 将调用views.yea_(request, year='2005', foo='bar')
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数。</span>
<code style="margin: 0px 3px; padding: 1px 3px; background: rgb(221, 221, 221); border: 1px solid rgb(204, 204, 204); font-family: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace; word-wrap: break-word; font-size: 14px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">django.conf.urls.url()</code><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。</span>
给include() 传递额外参数
概念<br>
为include() 传递额外参数。此时,被引入的 URL 配置中的每一行都将收到额外的参数
下述两个 URL 配置的作用是一样的
# main.py<br>from django.conf.urls import include, url<br>urlpatterns = [<br>url(r'^reviews/', include('inner'), {'reviewid': 3}),<br>]<br># inner.py<br>from django.conf.urls import url<br>from mysite import views<br>urlpatterns = [<br>url(r'^archive/$', views.archive),<br>url(r'^about/$', views.about),<br>]#第一种
# main.py<br>from django.conf.urls import include, url<br>from mysite import views<br>urlpatterns = [<br>url(r'^reviews/', include('inner')),<br>]<br># inner.py<br>from django.conf.urls import url<br>urlpatterns = [<br>url(r'^archive/$', views.archive, {'reviewid': 3}),<br>url(r'^about/$', views.about, {'reviewid': 3}),<br>]#第二种<br>
注意,不管 URL 模式是否能接收参数,额外的参数都将传给被引入的 URL 配置的每个模式。鉴于此,仅当<br>确定被引入的 URL 配置中的每个视图都接收传入的额外参数时,才应该这么做。
反向解析 URL
处理方式
只需在 URL 映射中设计 URL。我们为其提供 URL 配置,然后可以双向使用
• 从用户(浏览器)请求的 URL 开始,这个方案能调用正确的 Django 视图,并从 URL 中提取可能需要<br>的参数及其值,传给视图。<br>• 从 Django 视图对应的标识以及可能传入的参数值开始,获取相应的 URL。
反向解析 URL、反向匹配 URL、反向查找 URL 或 URL反转
• 在模板中,使用url 模板标签。<br>• 在 Python 代码中,使用django.core.urlresolvers.reverse() 函数。<br>• 在处理 Django 模型实例 URL 相关的高层代码中,使用get_absolute_url() 方法。
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">简单来说就是可以给我们的URL匹配规则起个名字,一个URL匹配模式起一个名字</span>
反转命名空间中的 URL
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> django.conf.urls <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> url<br></span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> . <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> views<br>urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"></span>url(r<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^articles/([0-9]{4})/$</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, views.year_archive, name=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">commente</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">)</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"></span>]</pre>
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> django.urls <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> reverse<br></span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> django.shortcuts <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> redirect<br><br></span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">def</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> redirect_to_year(request):<br> </span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);">#</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"> ...</span><br> year = 2006<br> <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);">#</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 128, 0);"> ...</span><br> <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">return</span> redirect(reverse(<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'comment</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, args=(year,)))</pre>
注意:
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">而另外一个应用中也有一个同样的名称comment,</span><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">建议使用</span><code style="margin: 0px 3px; padding: 1px 3px; background: rgb(221, 221, 221); border: 1px solid rgb(204, 204, 204); font-family: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace; word-wrap: break-word; font-size: 14px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">myapp-comment</code><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"> 而不是</span><code style="margin: 0px 3px; padding: 1px 3px; background: rgb(221, 221, 221); border: 1px solid rgb(204, 204, 204); font-family: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace; word-wrap: break-word; font-size: 14px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">comment</code>
args是一个元组
URL 命名空间
概念
同一个应用程序的多个实例使用相同的 URL 模式名称,而通过命名空间可以把它们<br>区分开。
URL 命名空间在反转具名 URL 模式时具有唯一确定性
1. 应用命名空间。指明应用的名称。一个应用的每个实例都具有相同的应用命名空间。例如,你可能猜<br>到了,Django 管理后台的应用命名空间是admin。<br>2. 实例命名空间。标识具体的应用程序实例。实例命名空间在整个项目范围内应该是唯一的。不过,实<br>例命名空间可以与应用命名空间相同,供应用的默认实例使用。例如,Django 管理后台实例的默认实<br>例命名空间是admin。
如何使用命名空间<br>
命名空间中的 URL 使用: 运算符指定。例如,管理后台的主页使用admin:index 引用。其中,admin 是命名空间,index 是 URL 的名称。
嵌套。members:reviews:index 在命名空间members 中查找命名空间reviews,再在里面查找index URL。
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> django.conf.urls <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> url, include<br>urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [<br> url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^a/</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, include(<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">app01.urls</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, namespace=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">author-polls</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">)), url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^b/</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, include(<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">a</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);"></span>namespace=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">publisher-polls</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">)),<br>] #</span><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">project中的urls.py</span></pre>
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> django.conf.urls <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> url<br></span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">from</span> app01 <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 255);">import</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> views<br>app_name </span>= <span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">app01</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"><br>urlpatterns </span>=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);"> [url(r</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">^(?P<pk>\d+)/$</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, views.detail, name=<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">detail</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(0, 0, 0);">)]</span><span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">#app中的urls.py</span></pre>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">模板中引用:</span>
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">{% url 'app01:detail' pk=12 pp=99 %}</pre>
<span style="color: rgb(0, 0, 0); font-family: "Helvetica Neue", Helvetica, Verdana, Arial, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">views中的函数中引用</span>
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px; color: rgb(0, 0, 0); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">v = reverse(<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">app01:detail</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>, kwargs={<span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">pk</span><span style="margin: 0px; padding: 0px; font-family: "Courier New" !important; font-size: 12px !important; line-height: 1.5 !important; color: rgb(128, 0, 0);">'</span>:11})</pre>
注意:<br>
reverse的参数是一个元组
子主题
反转命名空间中的 URL
待续
URL 命名空间和引入的 URL 配置
引入的 URL 配置放入命名空间中有两种方式
第一种
在 URL 模式中为include() 提供应用和实例命名<br>空间。例如:<br>url(r'^reviews/', include('reviews.urls',namespace='author-reviews',app_name='reviews')),<br>上述代码把reviews.urls 中定义的 URL 放在应用命名空间reviews 中,放在实例命名空间author-reviews中。
注意namespace为实例命名空间
子主题
子主题
第二种
引入包含命名空间数据的对象
如果使用include() 引入一组url() 实例,那个对象中<br>的 URL 都添加到全局命名空间中。然而,include() 的参数还可以是一个三元素元组,其内容如下
from django.conf.urls import include, url<br>from . import views<br>reviews_patterns = [<br>url(r'^$', views.IndexView.as_view(), name='index'),<br>url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),<br>]<br>url(r'^reviews/', include((reviews_patterns, 'reviews', 'author-reviews'))),
上述代码把指定的 URL 模式引入指定的应用和实例命名空间中。例如,部署的 Django 管理后台是AdminSite<br>的实例。AdminSite 对象有个urls 属性,它的值是一个三元素元组,包含相应管理后台的所有 URL 模式,以<br>及应用命名空间'admin' 和管理后台实例的名称。部署管理后台实例时,引入项目的urlpatterns 中的就是<br>这个urls 属性。<br>记得要把一个元组传给include()。如果直接传入三个参数,例如include(reviews_patterns, 'reviews',<br>'author-reviews'),Django 不会抛出错误,但是根据include() 的签名,'reviews' 是实例命名空间,'author-<br>reviews' 是应用命名空间,而正确的顺序应该反过来。
为 URL 模式命名
我们建议使用myapp-comment,而不是comment。
总结:项目应用多了之后,避免使用路由错乱,可以使用以下方法解决
为路由的re模式起别名
使用命名空间
命名空间的使用分为两种方式,看“URL命名空间的引入和URL配置”
Form 表单三要素<br>
action<br>
提交的url地址,method="POST”
默认方式
GET
<img src="data:image/png;base64,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" alt="">
数据的传输方式<br>
键等于值 and 键等于值
包含submit 按钮<br>
input,select、checkbox、textarea必须有一个name
form表单提交的数据,打印POST请求,是一个字典
<QueryDict: {'name1': ['SADF'], 'name2': ['ASDF']}>
这就是为什么使用request.get.("name")
多选select
加:multiple<br>
select标签写一个name属性
select里面被选中的option 的value拼成列表<br>
checkbox
让checbox的name名一致,以示一组<br>
后台使用getlist获取
<h3>csrf_token</h3>
在渲染页面时自动个页面加上一个字符串,是和后台数据库中的的一致,可以判断form表单的真伪<br>
提交数据之前submit封装数据
默认封装格式<br>
contentType:application/x-www-form-urlenconded
上传文件
HTTP请求的本质
<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">1.soket server 是启动的 bind((ip,port)) accept</div>
2.浏览器(soket客户端)输入域名<br>2.1解析域名 ->IP和端口 DNS<br>2.2 发请求 b'GET / HTTP/1.1.\r'n'HOST:127.0.0.1:800\r\nk1:var1\r\nk2:var2\r\n\r\n请求体'要获取请求体,根据两个连续的"\r\n"截取
<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">3、服务端接受数据</div>
<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">4、解析数据:URL/请求方法——处理数据</div>
<div style="white-space: pre-wrap; text-align: left; line-height: 1.75; font-size: 14px;">5、响应消息 ——>b"HTTP/1.1 200 OK\r\nConten-type:text/html;charset=utf8;\r\nk1:var2\r\n\r\n响应体", return 之前 会把HTML页面中的变量进行替换,包括script,HTTP协议发送的是字节。</div>
<h2>Django中操作Cookie</h2>
获取Cookie
wsgi
解析请求数据<br>
封装响应数据
评论
0 条评论
下一页