本篇文章核心内容:
1.两种不同的路由配置方法
2.post和get请求的相关概念及与浏览器中的交互体现
1.一般路由配置的方法
settings.py中的"ROOT_URLCONF"指定主路由文件中的urlpatterns配置列表找到文件位置
例如在 path('page/2022/', views.page_2022_view) 中会找到后面的视图函数。
path()函数 | |
导入方式 | from django.urls import path |
语法 | path(route匹配请求路径,views指定路径对应的视图处理函数, name= None地址起别名) |
1.1 使用path转换器来匹配url
转换器 | 例如:path('page/<int:page>', views.xxx) | 语法:<转换器类型:自定义名> |
例如的结果
转换器类型
str | 匹配除'/'之外的非空字符 (usually) |
int | 匹配0或任何正整数,返回一个int (usually) |
slug | 匹配任意由ASCII字母或数字以及连字符和下划线组成的短标签 detail/<slug:sl> --> /detail/this-is-djang |
path | 匹配非空字段,包括路径分隔符'/' |
1.2 利用转换器功能写一个小计算机
匹配格式: http://127.0.0.1:8080/整数/操作符/整数
# urls.py
import share.views as shview
path('int:n>/<str:op>/<int:n>',shview.cal_views)
# views.py
def cal_views(request, a, op, b):
if op not in ['add','sub', 'mul','div']:
return HttpResponse('your op is wrong')
result = 0
if op == 'add':
result = a+b
if op == 'sub':
result = a-b
if op == 'mul':
result = a*b
if op == 'div':
result = a/b
return HttpResponse('运算结果:%s'%(result))
最终结果:
2.使用正则的路由配置方法
2.1 进一步需求:对整数的位数有要求,比如只能算2位数之间的运算
re_path()函数 | |
引入方式 | from django.urls import re_path |
语法 | re_path(reg, view, name=xxx) |
特点 | 匹配提取后的值进行关键字传参,和path()函数一样 |
解决方案:re_path(r'^(?P<x>\d{1,2}/(?P<op>\w+)/(?P<y>\d{1,2})$‘, views.cal_view),
命名分组模式(?P<name>pattern)
r'str' | 原始字符串 |
^ | 以后面的字符或分组开头 |
?P<x> | 定义一个x的命名分组, w+多个字母 |
2.2 示例2:匹配年月日
匹配格式:http://127.0.0.1:8080/birthday/(year)/(month)/(day)
#urls.py
import share.views as shview
re_path(r'^birthday/(?P<y>\d{4}/(?P<m>\d{1,2})/(?P<d\{1,2}))$',shviews.birthday_view)
#views.py
def birthday_view(request ,y ,m ,d):
html = "{}年{}月{}日".format(y,m,d)
return HttpResponse(html)
3.请求和响应
请求是浏览器通过HTTP协议发送给服务端的数据,响应是指服务器接收请求后做出相应的处理再回复给浏览器段的数据。
3.1 HTTP协议的请求方法
有以下几种:GET ,HEAD ,POST ,PUT, DELETE, CONNECT, OPTIONS(服务器的性能),
TRACE (回显服务器收到的请求(诊断,测试))。
django接受到http协议的请求后,会根据请求数据创建HttpRequest对象;如下面代码,test_request视图函数第一个参数就是request对象,通过调用test_request函数显示相应函数方法功能。
from django.http import HttpResquest,HttpResponse
def test_request(request):
print('path info is', request.path_info) # 使用get_full_path()显示完整路径
print(''method is', request.method)
print('querystring is', request.GET) # 显示查询字符串
return HttpResponse('test request ok')
3.2 响应
HTTP响应状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 302 - 资源(网页等)被临时转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
响应对象 HttpResponse(content=, content_type=, status=)
例如 return HttpResponseRedirect('/page/1') 重定向资源到另一个url
3.3 get请求和post请求
如下函数把post和get分开进行处理
def test_get_post(request):
if request.method == 'GET':
print(request.GET['a'])
print(request.GET.get('c','no exist'))
return HttpResponse(POST_FORM)
elif request.method == 'POST': # 服务端接受请求
print('uname is ',request.POST['uname'])
return HttpResponse('post is ok')
else:
pass
return HttpResponse('--test get post --')
request两中GET方法,POST类似
request.GET['参数名'] | 字典形式获得,没有会触发keyError |
request.GET.getlist() | 查询字符串出现多个同名key,把value取出形成列表,应用场景: 问卷调查 -兴趣爱好 - 复选框 |
post 方法适用于隐私数据的提交,客户端通过表单等post请求将数据传递给服务器端
<form method = 'post' action='/login'>
<input type ="text" name= "username">
<input type= 'submit' value = '登录'>
</form>
<!-- post表单->
当在路由和视图模块中完成以上添加后,输入url:http://127.0.0.1:8080/test_get_post会发现报错;因为post提交会有一种网络攻击CSRF(大致了解一下)
解决方案:
- 注释middleware(settings.py)中 django.middleware.csrf...那一行就不会报错
- 在django中我们需要在templates的form中加入 {%csrf_token%}这串内容
最终结果: