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

视频:https://www.bilibili.com/video/BV1vK4y1o7jH

博客:https://blog.csdn.net/cpen_web


一. 路由配置

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>\d{1,2})/(?P<op>\w+)/(?P<y>\d{1,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>\d{4})/(?P<m>\d{1,2})/(?P<d>\d{1,2})$', views.birthday_view),
#http://127.0.0.1:8000/birthday/月2/日2/年4
re_path(r'^birthday/(?P<m>\d{1,2})/(?P<d>\d{1,2})/(?P<y>\d{4})$', views.birthday_view),
] <项目同名文件夹下>/views.py
def birthday_view(request, y, m, d):
html = "生日为%s年%s月%s日"%(y, m, d)
return HttpResponse(html)

Django Day02

请求和响应

GET请求和POST请求

Django的设计模式及模板层

模板层 - 变量和标签

模板层 - 过滤器和继承

url反向解析


二. 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请求方法,常用值:`GET`、`POST`

·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协议的请求和响应的更多相关文章

  1. 老李分享:HTTP协议之请求和响应

    老李分享:HTTP协议之请求和响应   HTTP请求头详解: GET http://www.foo.com/ HTTP/1.1 GET是请求方式,请求方式有GET/POST http://www.fo ...

  2. 【渗透课程】第二篇下-HTTP协议的请求与响应深度剖析

    [渗透课程]第二篇下-HTTP协议的请求与响应深度剖析 HTTP1.1目前支持以下7种请求方法: 常见的MIME类型如下: 第一个数字有五种可能的取值: 目录 什么是请求方法?什么是请求头? HTTP ...

  3. HTTP协议的请求和响应学习

    本篇作为学习servlet的前提,http协议是学习JavaWeb开发的基石,不深入了解http协议,就不能说掌握了JavaWeb开发. HTTP协议有两个版本:HTTP1.0和HTTP1.1,那么有 ...

  4. 【HTTP】HTTP协议的请求与响应

    创建时间:6.14 http协议 的位置 1.HTTP是什么 超文本传输协议(HyperText Transfer Protocol) 2.Http协议的组成 Http协议由Http请求和Http响应 ...

  5. #WEB安全基础 : HTTP协议 | 0x10 请求和响应报文重点结构及常见头部

    你需要认识一些常见的头部以及了解报文的详细结构 请求报文的请求行 GET/HTTP/1.1 响应报文的响应行 HTTP/1.1 200 OK 想必这些大家都知道了 请求 我访问一个页面 Host // ...

  6. Core3.0路由配置

    前言 MSDN文档,对ASP.NETCore中的路由完整的介绍 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/routing?vi ...

  7. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  8. Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session

    Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...

  9. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

随机推荐

  1. python小题目练习(二)

    题目:输出1-100之间不包括7的倍数,含有7的数的其他数 """Author:mllContent:输出1-100之间不包括7的倍数,含有7的数的其他数Date:202 ...

  2. Linux系列之查找命令

    前言 Linux 有四个常用的查找命令:locate.whereis.which 和 find.本文介绍它们的区别和简单用法. locate命令 这个命令将检查你的整个文件系统,并找到该关键词的每一次 ...

  3. RS485 MODBUS RTU通信协议

    1.RS485接口标准 RS485由RS232和RS422发展而来,弥补了抗干扰能力差.通信距离短.速率低的缺点,增加了多点.双向通信能力,即允许多个发送器连接在同一条主线上,同时增加了发送器的驱动能 ...

  4. 虚拟机安装Centos7.5详细教程

    VMware15.5虚拟机安装CentOS7.5详细教程   (前言)软件下载   需要VMware15.5软件和密匙的小伙伴可以从此地址下载:https://pan.baidu.com/s/1A8H ...

  5. 智能指针思想实践(std::unique_ptr, std::shared_ptr)

    1 smart pointer 思想 ​ 个人认为smart pointer实际上就是一个对原始指针类型的一个封装类,并对外提供了-> 和 * 两种操作,使得其能够表现出原始指针的操作行为. ​ ...

  6. ShardingSphere 云上实践:开箱即用的 ShardingSphere-Proxy 集群

    本次 Apache ShardingSphere 5.1.2 版本更新为大家带来了三大全新功能,其中之一即为使用 ShardingSphere-Proxy chart 在云环境中快速部署一套 Shar ...

  7. Excel用户如何打破内卷?只需要一个新软件,就能突破excel天花板

    还在死磕Excel吗?到底值不值得? 你看看,现在有多少excel培训班和培训课?网上各种EXCEL使用技巧教程也是满天飞.很多人为了提升Excel技能,不遗余力学习各种函数用法.VBA用法等等,最近 ...

  8. Neo4j应用

    CQL函数 1. 字符串函数 功能 描述 UPPER 将所有字母改为大写 LOWER 将所有字母改为小写 SUBSTRING 将获取指定范围的子字符串 REPLACE 替换一个字符串的子字符串 mat ...

  9. PHP单粒模式

    <?php class C { //三私一公 protected static $_instance = null; protected function __construct() //pro ...

  10. 【Java中的线程】java.lang.Thread 类分析

    进程和线程 联想一下现实生活中的例子--烧开水,烧开水时是不是不需要在旁边守着,交给热水机完成,烧开水这段时间可以去干一点其他的事情,例如将衣服丢到洗衣机中洗衣服.这样开水烧完,衣服洗的也差不多了.这 ...