URL 路由系统 + views 函数
一、URL
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
别名 name="reg" ,跟 标签 {% url "reg" %} 配合使用,意味着中国url 指向 别名代表的那个 url匹配。
这个 url 标签 有好几种情况用法,在 2.1 版本,【加参数,{% url 'bieming' {{ canshu }} %}】
【url.py 别名重名 https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial03/】
参数说明:
- 一个正则表达式字符串
- 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 可选的要传递给视图函数的默认参数(字典形式)
- 一个可选的name参数
二、例子
url(r'^index.html/(\d+)/(\w+)', views.index), def index(request,a,b):
print(request.GET)
print(a)
print(b)
return HttpResponse(a+" "+b) URL里有 无名分组匹配时候,会给 views 函数 位置传参 [15/Sep/2019 14:56:21] "GET /index.html/123/qwe HTTP/1.1" 200 8
<QueryDict: {}>
123
qwe =========================== url(r'^index1.html/(?P<year>\d{4})/(?P<month>\d{2})', views.index1 ), def index1(request,month,year):
print(request.GET)
print("year",year)
print("month",month)
return HttpResponse("year:{} month:{}".format(year,month)) URL里的有名分组,匹配到后给views函数 关键字传参,相当于在URL()的参数位置写上匹配到的字典。比如下面的例子
<QueryDict: {}>
[15/Sep/2019 14:59:01] "GET /index1.html/2020/03 HTTP/1.1" 200 18
year 2020
month 03 ========================== url(r'^index3.html/(?P<year>\d+)', views.index3 ,{"name":"qweqwe","age":12}), def index3(request,year,age,name):
print(request.GET)
print("year",year)
print("name",name)
print("age",age)
return HttpResponse(year) 当匹配到这个URL时候,会将有名分组 year +到后面的字典里, [15/Sep/2019 15:02:16] "GET /index3.html/2020 HTTP/1.1" 200 4
year 2020
name qweqwe
age 12 ============================== url(r'^index2.html$', views.index2), def index2(request):
print(request.GET)
aa = request.GET.get("aa")
print(aa)
return HttpResponse(aa) 【http://127.0.0.1:8888/index2.html?aa=213】
请求的URL是带有传参的,这种传参是赋值给 get方法 <QueryDict: {'aa': ['']}>
[15/Sep/2019 15:11:53] "GET /index2.html?aa=213 HTTP/1.1" 200 3
213
三、路由分发
存在将不同URL分类到不同的APP中再处理,采取路由分发
在 项目的 urls.py 文件
导入 include
from django.conf.urls import url,include url(r'^app01', include("app01.urls")), 在 APP01 下创建 urls.py 文件
所有app01 的请求就转到 APP01 下的 urls.py 文件 做URL处理。
APP01 下的 urls.py 文件
from django.conf.urls import url,include
from app01 import views
urlpatterns = [
url(r'/index.html', views.index4),
url(r'/register', views.register),
]
views.py 的函数
def index4(request): return render(request,"index.html") def register(request):
print("post ",request.POST) return HttpResponse("ok111")
模板文件【HTML】的 form表单 , post 请求
<h1>学生注册</h1>
<form action="/app01/register" method="post">
{% csrf_token %} {# post 请求 加这个 #}
<p>姓名 <input type="text" name="user"></input></p>
<p>年龄 <input type="text" name="age"></input></p>
<p>爱好
<input type="checkbox" name="hobby" value="1">足球</input>
<input type="checkbox" name="hobby" value="2">篮球</input>
<input type="checkbox" name="hobby" value="3">乒乓球</input>
</p>
<p><input type="submit" >提交</p>
</form>
最后 在 后台打印
post <QueryDict:
{
'csrfmiddlewaretoken': ['qzqavNxXMQtYzbNdUUa1mfZp6GpqU3tCCYlvJQUWLhd0mJ3gxpsTYDKR0P3biwrr'],
'user': ['qwe'],
'age': ['2'],
'hobby': ['1']
}
>
如果改成 get 请求, 那么 会在URL地址栏 看到提交后的 URL是把 提交的参数显示出来了,
chome 开发者模式 也能看到
Request URL: http://127.0.0.1:8888/app01/register?user=qwe&age=2222222222&hobby=3
Request Method: GET
Status Code: 200 OK
Remote Address: 127.0.0.1:8888
Referrer Policy: no-referrer-when-downgrade
后台打印
<QueryDict:
{
'user': ['qwe'],
'age': [''],
'hobby': ['']}
>
这个 就没有 token 了
四、视图函数 views
http请求中产生两个核心对象:
http请求:HttpRequest对象
http响应:HttpResponse对象
所在位置:django.http
之前我们用到的参数request就是HttpRequest 检测方法:isinstance(request,HttpRequest)
HttpRequest对象的属性和方法:
# path: 请求页面的全路径,不包括域名
#
# method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如
#
# if req.method=="GET":
#
# do_something()
#
# elseif req.method=="POST":
#
# do_something_else()
#
# 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.AnonymousUser的实例。你
# 可以通过user的is_authenticated()方法来辨别用户是否登陆:
# if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
# 时该属性才可用
#
# session: 唯一可读写的属性,代表当前会话的字典对象;自己有激活Django中的session支持时该属性才可用。 #方法
get_full_path(), 比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123
req.path:/index33
注意一个常用方法:request.POST.getlist('')
HttpResponse对象:
对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse
在HttpResponse对象上扩展的常用方法:
页面渲染: render()(推荐)
页面跳转: redirect("路径")
locals(): 可以直接将函数中所有的变量传给模板
URL 路由系统 + views 函数的更多相关文章
- URL路由系统-命名空间
命名空间 1.工程Django下的urs.py from django.conf.urls import url,include from django.urls import path,re_pat ...
- python django基础二URL路由系统
URL配置 基本格式 from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数 ...
- day 66 Django基础二之URL路由系统
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...
- day 53 Django基础二之URL路由系统
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...
- Django的URL路由系统
一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...
- Django之URL路由系统
一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...
- Django之URL(路由系统)用法
路由系统 路由系统概念 简而言之,路由系统就是路径和视图函数的一个对应关系.django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里 ...
- url 路由系统
Django的路由系统 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 我们就是以这种方式告诉Django,遇到哪个URL的时 ...
- Django基础二之URL路由系统
一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...
随机推荐
- Java 并发(1)——线程安全
我们对并发一词并不陌生,它通常指多个任务同时执行.实际上这不完全对,“并行”才是真正意义上的同时执行,而“并发”则更偏重于多个任务交替执行.有时候我们会看见一些人一边嘴里嚼着东西一边讲话,这是并行:当 ...
- SpringBoot Junit Demo
package com.yunen.camera.test; import org.junit.Before; import org.junit.Test; import org.junit.runn ...
- 8.Python网络编程_多线程死锁
死锁:指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死 ...
- 【洛谷P1963】[NOI2009]变换序列(二分图匹配)
传送门 题意: 现有一个\(0\)到\(n-1\)的排列\(T\),定义距离\(D(x,y)=min\{|x-y|,N-|x-y|\}\). 现在给出\(D(i, T_i)\),输出字典序最小的符合条 ...
- 3.web基础$_GET
http://123.206.87.240:8002/get/
- 详解C++ STL set 容器
详解C++ STL set 容器 本篇随笔简单介绍一下\(C++STL\)中\(set\)容器的使用方法及常见使用技巧. set容器的概念和性质 \(set\)在英文中的意义是:集合.\(set\)容 ...
- LG1505 [国家集训队]旅游 树链剖分
问题描述 LG1505 题解 边化点权. 超级多操作的树剖板子... 以后就拿这个当树剖板子复习吧... \(\mathrm{Code}\) #include<bits/stdc++.h> ...
- 爬虫——控制台抓包和requests.post()发送请求
控制台抓包 打开方式及常用选项 1.打开浏览器,F12打开控制台,找到Network选项卡 2.控制台常用选项 1.Network: 抓取网络数据包 1.ALL: 抓取所有的网络数据包 2.XHR:抓 ...
- QQ音乐2019客户端-获取任意歌单完整歌曲列表和下载音乐文件方法
步骤 1.在web网站上搜搜任意歌单 https://y.qq.com/#type=index/ 例如:中国好声音4.5.6.7.8季 打开后显示网址: https://y.qq.com/n/yqq ...
- vuex 源码解析(四) mutation 详解
mutation是更改Vuex的store中的状态的唯一方法,mutation类似于事件注册,每个mutation都可以带两个参数,如下: state ;当前命名空间对应的state payload ...