zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Django(6)-请求及响应

django响应 请求
2023-09-14 09:12:52 时间

Django(1)-简介

Django(2)-创建项目及默认项目目录结构介绍

Django(3)-配置文件详解

Django(4)-URL和视图

Django(5)-路由配置实例

Django(6)-请求及响应

Django(7)-Get请求和Post请求

Django(8)-设计模式

Django(9)-模板层简介与入门实例

Django(10)-模板层的变量和标签

Django(11)-模板层的过滤器和继承

Django(12)-url反向解析

Django(13)-静态文件

Django(14)-应用及分布式路由

Django(15)-模型层及ORM介绍

Django(16)-ORM基础字段及选项

Django(17)-ORM创建数据

Django(18)-ORM常用的查询函数详解及实例演示

Django(19)-ORM条件查询

Django(20)-ORM更新操作及实例演示

Django(21)-ORM删除操作及实例演示

Django(22)-ORM中F对象和Q对象

Django(23)-ORM聚合查询和原生数据库操作

Django(24)-admin后台管理设置步骤以及常见样式详解

Django实战技巧(1)-开发测试生产环境配置切换处理技巧

Django实战技巧(2)-git代码仓分支管理技巧

Django实战技巧(3)-项目配置

1、请求和响应的含义

  • 请求是指浏览器端通过http协议发送给服务器端的数据
  • 响应是指服务器端接收到请求后做相应的处理后再回复给浏览器端的数据
    如下:
    在这里插入图片描述

2、请求

  • 报文:
    使用fiddler抓一个包,请求报文如下:
GET http://127.0.0.1:8080/birthday/12/06/2015 HTTP/1.1   
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: csrftoken=Cqi97b6aobuz1rZX0f5VTV0EwswRoU843wqbmCX8O9Fof3rmmifxEdXuAGaSX6Ts
  • 请求的方法

    • Get:请求指定页面信息,并返回实体主体
    • Head:类似get请求,只不过返回的响应中没有具体的内容,用于获取报文头
    • Post:想指定资源提交数据进行数据处理请求,数据被包含在请求体中,Post请求一般会导致新的资源的建立或者已有资源的修改
    • Put:从客户端想服务器传送数据取代指定的文档的内容
    • Delete:请求服务器删除指定的页面
    • Connect:Http1.1协议中预留给能够将链接改为管道方式的代理服务器,使用fiddler抓包的时候就会使用的Connect方法
    • Options:允许客户端查看服务器的性能
    • Trace:回显服务器收到的请求,主要用于测试或者诊断

    注意:post方法也可以更改数据,但是如果按照标准的restful协议,post应该是指创建资源,put是用来更新资源的

  • Django中的请求

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

    • path_info:URL字符串
    • method:字符串,表示HTTP请求方法,常用之GET,POST
    • GET:QueryDict查询字典对象,包含get请求方式的所有数据
    • POST:QueryDict查询字典的对象,包含post请求方式的所有数据
    • FILES:类似与字典的对象,包含所有的上传文件的信息
    • COOKIES:Python字典,包含所有的cookie,键和值都是字符串
    • session:类似字典的对象,表示当前会话
    • body:字符串,请求体的内容
    • scheme:请求协议(http/https)
    • get_full_path():请求完整路径
    • META:请求头中的元数据(消息头)
    • META[“REMOTE_ADDR”]:客户端的ip地址

    例如:假设路由如下:
    在这里插入图片描述
    视图函数中加入一些request属性的打印信息,如下:

from django.http import HttpResponse


def birthday(request,year,month,day):
    html=f"生日为:{year}{month}{day}日"
    print(11111111111111111111111)
    print("request.path_info:",request.path_info)
    print("request.method:",request.method)
    print("request.GET:",request.GET)
    print("request.POST:",request.POST)
    print("request.FILES:",request.FILES)
    print("request.COOKIES:",request.COOKIES)
    print("request.session:",request.session)
    print("request.body:",request.body)
    print("request.scheme:",request.scheme)
    print("request.get_full_path():",request.get_full_path())
    print("request.META:",request.META)
    print("request.META['REMOTE_ADDR']",request.META['REMOTE_ADDR'])
    print(22222222222222222222222)
    return HttpResponse(html)

然后在浏览器中请求:http://127.0.0.1:8080/birthday/12/06/2015?name=redrose&age=20

django后台打印如下显示结果:

Django version 3.2.3, using settings 'mysite1.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CTRL-BREAK.
11111111111111111111111
request.path_info: /birthday/12/06/2015
request.method: GET
request.GET: <QueryDict: {'name': ['redrose'], 'age': ['20']}>
request.POST: <QueryDict: {}>
request.FILES: <MultiValueDict: {}>
request.COOKIES: {'csrftoken': 'Cqi97b6aobuz1rZX0f5VTV0EwswRoU843wqbmCX8O9Fof3rmmifxEdXuAGaSX6Ts'}
request.session: <django.contrib.sessions.backends.db.SessionStore object at 0x000001C53449FCD0>
request.body: b''
request.scheme: http
request.get_full_path(): /birthday/12/06/2015?name=redrose&age=20
request.META: {'CONDA_DEFAULT_ENV': 'python39', 'CONDA_EXE': 'D:\\ProgrameFile\\Miniconda\\Scripts\\conda.exe', 'CONDA_PREFIX': 'D:\\ProgrameFile\\Miniconda\\envs\\pytho
n39', 'CONDA_PROMPT_MODIFIER': '(python39) ', 'CONDA_PYTHON_EXE': 'D:\\ProgrameFile\\Miniconda\\python.exe', 'CONDA_SHLVL': '1', 'PIPENV_ACTIVE': '1', 'PIP_DISABLE_PIP_V
ERSION_CHECK': '1', 'PIP_PYTHON_PATH': 'd:\\programefile\\miniconda\\envs\\python39\\python.exe', 'PROJECT_SETTING': 'G:\\python-flask-demo\\demo_001_hello_world\\settin
g.py', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'JAVA_HOME': 'D:\\ProgrameFile\\Java\\', 'CHOCOLATEYINSTALL': 'C:\\ProgramData\\chocolatey', 'PROMPT': '(
django-5F60hEIM) (python39) $P$G', 'PYTHONDONTWRITEBYTECODE': '1', 'VIRTUAL_ENV': 'C:\\Users\\Administrator\\.virtualenvs\\django-5F60hEIM', '__INTELLIJ_COMMAND_HISTFILE
__': 'C:\\Users\\Administrator\\AppData\\Roaming\\JetBrains\\PyCharm2020.1\\terminal\\history\\history-687', 'SYSTEMDRIVE': 'C:', 'CLASSPATH': '.;D:\\ProgrameFile\\Java\
\\\lib;D:\\ProgrameFile\\Java\\\\lib\\tools.jar', 'LOGONSERVER': '\\\\REDROSE2100-NJ', 'WEBSTORM': 'D:\\ProgrameFile\\WebStorm 2020.1\\bin;', 'TMP': 'C:\\Users\\ADMINI~1
\\AppData\\Local\\Temp', 'HOMEPATH': '\\Users\\Administrator', 'DATAGRIP': 'D:\\ProgrameFile\\DataGrip 2020.3\\bin;', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;
.WSF;.WSH;.MSC;.PYW', 'IDEA_INITIAL_DIRECTORY': 'C:\\Users\\Administrator\\Desktop', 'NUMBER_OF_PROCESSORS': '6', 'PYCHARM': 'D:\\ProgrameFile\\PyCharm 2020.1\\bin;', 'U
SERNAME': 'Administrator', 'PROGRAMFILES': 'C:\\Program Files', 'USERDOMAIN_ROAMINGPROFILE': 'REDROSE2100-NJ', 'LOCALAPPDATA': 'C:\\Users\\Administrator\\AppData\\Local'
, 'TERMINAL_EMULATOR': 'JetBrains-JediTerm', 'PROGRAMDATA': 'C:\\ProgramData', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 158 Stepping 10, GenuineIntel', 'DRIVERDAT
A': 'C:\\Windows\\System32\\Drivers\\DriverData', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 'HOMEDRIVE': 'C:', 'ALLUSERSPROFILE': 'C:\\ProgramData', 'USER
DOMAIN': 'REDROSE2100-NJ', 'INTELLIJ IDEA': 'D:\\ProgrameFile\\IntelliJ IDEA 2020.1\\bin;', 'PROCESSOR_LEVEL': '6', 'CHOCOLATEYLASTPATHUPDATE': '132386891598834974', 'CO
MSPEC': 'C:\\windows\\system32\\cmd.exe', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PUBLIC': 'C:\\Users\\Public', 'SYSTEMROOT': 'C:\\windows', 'PROCESSOR_REVISION': '9e0a', 'T
EMP': 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\windows\\system32\\WindowsPowerShell\\v1.0\\Modules
', 'QT_PLUGIN_PATH': 'D:\\Python38\\Lib\\site-packages\\PyQt5\\Qt\\plugins', 'PATH': 'C:\\Users\\Administrator\\.virtualenvs\\django-5F60hEIM\\Scripts;D:\\ProgrameFile\\
Miniconda\\envs\\python39;D:\\ProgrameFile\\Miniconda\\envs\\python39\\Library\\mingw-w64\\bin;D:\\ProgrameFile\\Miniconda\\envs\\python39\\Library\\usr\\bin;D:\\Program
eFile\\Miniconda\\envs\\python39\\Library\\bin;D:\\ProgrameFile\\Miniconda\\envs\\python39\\Scripts;D:\\ProgrameFile\\Miniconda\\envs\\python39\\bin;D:\\ProgrameFile\\Mi
niconda\\condabin;D:\\ProgrameFile\\Miniconda;D:\\ProgrameFile\\Miniconda\\Library\\mingw-w64\\bin;D:\\ProgrameFile\\Miniconda\\Library\\usr\\bin;D:\\ProgrameFile\\Minic
onda\\Library\\bin;D:\\ProgrameFile\\Miniconda\\Scripts;C:\\windows\\system32;C:\\windows;C:\\windows\\System32\\Wbem;C:\\windows\\System32\\WindowsPowerShell\\v1.0;C:\\
windows\\System32\\OpenSSH;C:\\ProgramData\\chocolatey\\bin;C:\\Program Files\\dotnet;D:\\ProgrameFile\\Google\\Chrome\\Application;D:\\ProgrameFile\\Ruby24\\bin;C:\\Pro
gram Files\\nodejs;D:\\ProgrameFile\\Java\\bin;D:\\ProgrameFile\\Java\\jre\\bin;D:\\ProgrameFile\\apache-maven-3.3.9\\bin;D:\\ProgrameFile\\Git\\cmd;C:\\Users\\Administr
ator\\AppData\\Local\\Microsoft\\WindowsApps;D:\\ProgrameFile\\PyCharm 2020.1\\bin;.;C:\\Program Files\\Bandizip;C:\\Users\\Administrator\\AppData\\Roaming\\npm;D:\\Prog
rameFile\\IntelliJ IDEA 2020.1\\bin;.;D:\\ProgrameFile\\WebStorm 2020.1\\bin;.;D:\\ProgrameFile\\DataGrip 2020.3\\bin;.;D:\\ProgrameFile\\fiddler', 'PROGRAMFILES(X86)':
'C:\\Program Files (x86)', 'USERPROFILE': 'C:\\Users\\Administrator', 'SESSIONNAME': 'Console', 'WINDIR': 'C:\\windows', 'PROGRAMW6432': 'C:\\Program Files', 'OS': 'Wind
ows_NT', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMPUTERNAME': 'REDROSE2100-NJ', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', '
DJANGO_SETTINGS_MODULE': 'mysite1.settings', 'RUN_MAIN': 'true', 'SERVER_NAME': 'redrose2100-NJ', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8080', 'REMOTE_HOST': '
', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/birthday/12/06/20
15', 'QUERY_STRING': 'name=redrose&age=20', 'REMOTE_ADDR': '127.0.0.1', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '127.0.0.1:8080', 'HTTP_CONNECTION': 'keep-alive', 'HT
TP_CACHE_CONTROL': 'max-age=0', 'HTTP_SEC_CH_UA': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"', 'HTTP_SEC_CH_UA_MOBILE': '?0', 'HTTP_UPGRADE_INSECU
RE_REQUESTS': '1', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36', 'HTTP_ACCEPT
': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'HTTP_SEC_FETCH_SITE': 'non
e', 'HTTP_SEC_FETCH_MODE': 'navigate', 'HTTP_SEC_FETCH_USER': '?1', 'HTTP_SEC_FETCH_DEST': 'document', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE
': 'zh-CN,zh;q=0.9', 'HTTP_COOKIE': 'csrftoken=Cqi97b6aobuz1rZX0f5VTV0EwswRoU843wqbmCX8O9Fof3rmmifxEdXuAGaSX6Ts', 'wsgi.input': <django.core.handlers.wsgi.LimitedStream
object at 0x000001C53449FBB0>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_sc
heme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>, 'CSRF_COOKIE': 'Cqi97b6aobuz1rZX0f5VTV0Ewsw
RoU843wqbmCX8O9Fof3rmmifxEdXuAGaSX6Ts'}
request.META['REMOTE_ADDR'] 127.0.0.1
22222222222222222222222
[31/May/2021 13:32:38] "GET /birthday/12/06/2015?name=redrose&age=20 HTTP/1.1" 200 29

3、响应

响应报文如下:

HTTP/1.1 200 OK
Date: Mon, 31 May 2021 10:35:47 GMT
Server: WSGIServer/0.2 CPython/3.9.1
Content-Type: text/html; charset=utf-8
X-Frame-Options: DENY
Content-Length: 29
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin

生日为:20151206
  • 状态码分类:

    • 1xx:信息、服务器收到请求,需要请求者继续执行操作
    • 2xx:成功,操作被成功接收并处理
    • 3xx:重定向,需要进一步的操作以完成请求
    • 4xx:客户端错误,请求包含语法错误或者无法完成请求
    • 5xx:服务器错误,服务器在处理请求的过程中发生了错误
  • 常见的状态码

    • 200:请求成功
    • 201:创建成功
    • 204:删除成功
    • 301:永久重定向,资源被永久转移到其他的URL
    • 302:临时重定向
    • 400:客户端发送的请求数据错误
    • 401:认证错误
    • 403:权限不足
    • 404:请求资源不存在
    • 409:创建的资源已存在
    • 500:内部服务器错误
  • Django中的响应对象

    • HTTPResponse(content=响应体,content_type=响应体类型,status=状态码)
    • 作用:向客户端浏览器返回响应,同时携带响应体内容
  • 常见的Content-Type值:

    • text/html:默认的,html文件
    • text/plain:纯文本
    • text/css:css文件
    • text/javascript:js文件
    • multipart/form-data:文件提交
    • application/json:json传输
    • application/xml:xml文件
  • HTTPResponse常见子类

    • HttpResponseRedirect:重定向,状态码302
    • HttpResponseNotModified:未修改,状态码304
    • HttpResponseBadRequest:错误请求:状态码400
    • HttpResponseNotFound:没有对应资源:状态码404
    • HttpResponseForbidden:请求被禁止,状态码403
    • HttpResponseServerError:服务器错误,状态码500

举例:
路由如下:
在这里插入图片描述
视图函数实现如下:即检查月份是否大于12和日是否大于31,如果大于了则返回一个HttpResponseBadRequest错误请求

from django.http import HttpResponse,HttpResponseBadRequest


def birthday(request,year,month,day):
    html=f"生日为:{year}{month}{day}日"
    if int(month)>12 or int(day)>31:
        return HttpResponseBadRequest("月份或日非法")
    return HttpResponse(html)

在浏览器请求:http://127.0.0.1:8080/birthday/13/06/2015,得到如下结果,与代码吻合
在这里插入图片描述