02_Django-路由配置-HTTP协议的请求和响应

Posted cPen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了02_Django-路由配置-HTTP协议的请求和响应相关的知识,希望对你有一定的参考价值。

博客链接 https://blog.csdn.net/cPen_web
视频链接 https://www.bilibili.com/video/BV1vK4y1o7jH


路由配置

settings.py中的ROOT_URLCONF指定了主路由配置列表urlpatterns的文件位置

# file: <项目同名文件夹下>/urls.py
urlpatterns = [
    path('page/2003/', views.page_2003_view),
    ... # 此处配置主路由
]

path()

path()函数

path()函数
导入 - from django.urls import path
语法 - path(route, views, name=None)
参数:
        1.route: 字符串类型,匹配的请求路径
        2.views: 指定路径所对应的视图处理函数的名称
        3.name: 为地址起别名,在模块中地址反向解析时使用

练习 - 建立一个小网站:
    输入网址:http://127.0.0.1:8000, 在网页中输出:这是我的首页
    输入网址:http://127.0.0.1:8000/page/1, 在网页中输出:这是编号为1的网页
    输入地址:http://127.0.0.1:8000/page/2, 在网页中输出:这是编号为2的网页
http://127.0.0.1:8000
http://127.0.0.1:8000/page/1
http://127.0.0.1:8000/page/2
# <项目同名文件夹下>/urls.py
urlpatterns = [
    #http://127.0.0.1:8000
    path('', views.index_view),
    #http://127.0.0.1:8000/page/1
    path('page/1', views.page1_view),
    #http://127.0.0.1:8000/page/2
    path('page/2', views.page2_view)
]

# <项目同名文件夹下>/views.py
def index_view(request):
    html = '这是我的首页'
    return HttpResponse(html)

def page1_view(request):
    html = '这是编号为1的网页'
    return HttpResponse(html)

def page2_view(request):
    html = '这是编号为2的网页'
    return HttpResponse(html)
思考
建立如上一百个网页该怎么办?
例如:
    http://127.0.0.1:8000/page/3
    http://127.0.0.1:8000/page/4
    ...
    http://127.0.0.1:8000/page/100

path转换器

语法:<转换器类型: 自定义名>
作用:若转换器类型匹配到对应类型的数据,则将数据按照关键字传参的方式传递给视图函数
例子:path(‘page/<int:page>’, view.xxx)

转换器类型:str、int、slug、path

# http://127.0.0.1:8000/page/30

# <项目同名文件夹下>/urls.py
urlpatterns = [
    #http://127.0.0.1:8000/page/3-100
    path('page/<int:pg>', views.pagen_view)
]

# <项目同名文件夹下>/views.py
def pagen_view(request, pg):
    html = '这是编号为%s的网页!'%(pg)
    return HttpResponse(html)
练习:小计算器
    定义一个路由的格式为:
    http://127.0.0.1:8000/整数/操作字符串[add/sub/mul]/整数
    从路由中提取数据,做相应的操作后返回给浏览器
    效果如下:
        输入:127.0.0.1:8000/100/add/200
        页面显示结果:300
# http://127.0.0.1:8000/100/add/200
# 结果为:300

# <项目同名文件夹下>/urls.py
urlpatterns = [
    #http://127.0.0.1:8000/整数/操作符/整数
    path('<int:n>/<str:op>/<int:m>', views.cal_view)
]

# <项目同名文件夹下>/views.py
def cal_view(request, n, op, m):
    if op not in ['add', 'sub', 'mul']:
        return HttpResponse('Your op is wrong')
    result = 0
    if op == 'add':
        result = n + m
    elif op == 'sub':
        result = n - m
    elif op == 'mul':
        result = n * m
    return HttpResponse('结果为:%s'%(result))

re_path()

re_path()函数

re_path()函数
在url的匹配过程中可以使用正则表达式进行精确匹配
语法:
        re_path(reg, view, name=xxx)
        正则表达式为命名分组模式(?P<name>pattern); 匹配提取参数后用关键字传参方式传递给视图函数

# 样例
# 可匹配 http://127.0.0.1:8000/20/mul/40
# 不可匹配 http://127.0.0.1:8000/200/mul/400

# http://127.0.0.1:8000/10/add/20  ->  x:10 op:add y:20

# <项目同名文件夹下>/urls.py
from django.urls import path, re_path

urlpatterns = [
    #http://127.0.0.1:8000/整数2/操作符/整数2
    re_path(r'^(?P<x>\\d1,2)/(?P<op>\\w+)/(?P<y>\\d1,2)$', views.cal2_view),
]		# \\d 整数; \\w 字符

# <项目同名文件夹下>/views.py
def cal2_view(request, x, op, y):
    html = 'x:%s op:%s y:%s'%(x, op, y)
    return HttpResponse(html)
练习
访问地址:
    http://127.0.0.1:8000/birthday/四位数字/一到两位数字/一到两位数字
    http://127.0.0.1:8000/birthday/一到两位数字/一到两位数字/四位数字
最终输出:生日为:xxxx年xx月xx日

效果样例:
    输入网址:http://127.0.0.1:8000/birthday/2015/12/11
    显示为:生日为:2015年12月11日
    输入网址:http://127.0.0.1:8000/birthday/2/28/2008
    显示为:生日为:2008年2月28日
# http://127.0.0.1:8000/birthday/1992/01/01
# 生日为1992年01月01日

# <项目同名文件夹下>/urls.py
urlpatterns = [
    #http://127.0.0.1:8000/birthday/年4/月2/日2
    re_path(r'^birthday/(?P<y>\\d4)/(?P<m>\\d1,2)/(?P<d>\\d1,2)$', views.birthday_view),
    #http://127.0.0.1:8000/birthday/月2/日2/年4
    re_path(r'^birthday/(?P<m>\\d1,2)/(?P<d>\\d1,2)/(?P<y>\\d4)$', views.birthday_view),
]

# <项目同名文件夹下>/views.py
def birthday_view(request, y, m, d):
    html = "生日为%s年%s月%s日"%(y, m, d)
    return HttpResponse(html)

HTTP协议的请求和响应

定义
        请求是指浏览器端通过HTTP协议发送给服务器端的数据
        响应是指服务器端接收到请求后做相应的处理后再回复给浏览器端的数据

请求

请求样例

请求中的方法

根据HTTP标准,HTTP请求可以使用多种请求方法
HTTP1.0定义了三种请求方法:GET,POST和HEAD方法(最常用)
HTTP1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法

Django中的请求

请求在Django中实则就是 视图函数的第一个参数,即HttpRequest对象
Django接收到http协议的请求后,会根据请求数据报文创建HttpRequest对象
HttpRequest对象 通过属性 描述了 请求的 所有相关信息

  • path_info:URL字符串
  • method:字符串,表示HTTP请求方法,常用值:GETPOST
  • GETQueryDict查询字典的对象,包含get请求方法的所有数据
  • POST:QueryDict查询字典的对象,包含post请求方式的所有数据
  • FILES:类似于字典的对象,包含所有的上传文件信息
  • COOKIES:Python字典,包含所有的cookie,键和值都为字符串
  • session:似于字典的对象,表示当前的会话
  • body:字符串,请求体的内容(POST或PUT)
  • scheme:请求协议(‘http’/‘https’)
  • request.get_full_path():请求的完整路径
  • request.META:请求中的元数据(消息头)
        - request.META[‘REMOTE_ADDR’]:客户端IP地址
# http://127.0.0.1:8000/test_request?a=1&b=1
# test request ok
# 终端
# path info is /test_request
# method is GET
# querystring is <QueryDict: 'a': ['1'], 'b': ['1']>
# full path is /test_request?a=1&b=1
# [20/Dec/2021 23:27:09] "GET /test_request?a=1&b=1 HTTP/1.1" 200 15

# <项目同名文件夹下>/urls.py
urlpatterns = [
    path('test_request', views.test_request)
]

# <项目同名文件夹下>/views.py
def test_request(request):
    print('path info is', request.path_info)
    print('method is', request.method)
    print('querystring is', request.GET)
    print('full path is', request.get_full_path())
    return HttpResponse('test request ok')

响应

响应样例

响应状态码

HTTP状态码的英文为HTTP Status Code
下面是常见的HTTP状态码:

  • 200 - 请求成功
  • 301 - 永久重定向-资源(网页等)被永久转移到其它URL
  • 302 - 临时重定向
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

Django中的响应对象

构造函数格式:
        HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
作用:
        向客户端浏览器返回响应,同时携带响应体内容

常用的Conten-Type如下

  • text/html’(默认的,html文件)
  • ‘text/plain’(纯文本)
  • ‘text/css’(css文件)
  • text/javascript’(js文件)
  • ‘multipart/form-data’(文件提交)
  • ‘application/json’(json传输)
  • ‘application/xml’(xml文件)

HttpResponse子类

# http://127.0.0.1:8000/test_request
#   => http://127.0.0.1:8000/page/1

# <项目同名文件夹下>/urls.py
urlpatterns = [
    path('test_request', views.test_request)
]

# <项目同名文件夹下>/views.py
from django.http import HttpResponse, HttpResponseRedirect

def test_request(request):
    return HttpResponseRedirect('/page/1')

以上是关于02_Django-路由配置-HTTP协议的请求和响应的主要内容,如果未能解决你的问题,请参考以下文章

02_Django-路由配置-HTTP协议的请求和响应

HTTP协议 django下载安装 url路由分发

rip路由协议基本配置

Django框架HTTP协议文件配置路由设置

9. http协议_响应状态码_页面渲染流程_路由_中间件

复习回顾--Django