Django进阶–请求与响应 1
1 Django服务流程
2 HttpRequest ¶
服务器接收到http协议的请求后,会根据报文创建HttpRequest对象。视图函数的第一个参数(request)就是HttpRequest对象,框架在django.http模块中定义了HttpRequest对象的API。
2.1 HttpRequest对象属性 ¶
-
path
返回该请求的URL的完整路径的字符串,不包括参数或域名。>>request.path result = {str}'/book/retest/9/'
-
method
返回请求中使用的HTTP方法的字符串。返回结果是大写的。例如:>>request.method result = {str}'GET'
-
encoding
以字符串形式返回表单提交数据的当前编码方式(值为
None
,表示使用该DEFAULT_CHARSET
设置)。您可以写入此属性以更改访问表单数据时使用的编码。任何后续属性访问(例如从GET
或读取POST
)都将使用新encoding
值。如果您知道表单数据不在DEFAULT_CHARSET
编码中,则非常有用。>>request.encoding result = {NoneType}None #设置值为utf-8后 result = {str}'utf-8'
-
GET
返回字典对象,包含所有给定的HTTP GET参数。- QueryDict类型的对象
- 包含get请求方式的所有参数
- 与url请求地址中的参数对应,位于?后面
- 参数的格式是键值对,如key1=value1
- 多个参数之间,使用&连接,如key1=value1&key2=value2
-
POST
包含所有给定的HTTP POST参数,前提是请求包含表单数据。
-
如果需要访问请求中发布的原始或非表单数据,请通过该
HttpRequest.body
属性访问该数据 。 -
POST
它不包含文件上传信息。 -
QueryDict类型的对象
-
包含post请求方式的所有参数
-
与form表单中的控件对应
-
表单中控件要有name属性,则name属性的值为键,value属性的值为值,构成键值对提交
-
对于checkbox控件,name属性一样为一组,当控件被选中后会被提交,存在一键多值的情况
-
session
返回类似字典对象,表示当前会话,Django开启会话支持才能使用。
-
COOKIES
返回标准字典对象,表示cookies,键和值均为字符串。后面同session做详细介绍,本篇不论。
-
is_ajax()
返回bool值,通过XmlHttpRequest对象(ajax)访问的返回True。>>request.is_ajax() result = {bool} False
-
FILES ¶
包含所有上传文件的类字典对象,后面会讲到。
3 文件上传
3.1 简介
FILES只有在请求的方法为POST且提交的<form>
带有enctype="multipart/form-data"
的情况下才会包含数据。否则,FILES将为一个空的类似于字典的对象。
文件数据被保存在了request.FILES
(详见2.1-9)中,request.FILES
返回类字典值,key 对应中的name属性值。
3.2 举个栗子
1. 模板文件
<h1>请上传</h1>
<form action="" , method="post" enctype="multipart/form-data" >
{% csrf_token %}
<input type="file" name="file" multiple><br \> <!--允许多个文件上传-->
<input type="submit" value="上传" >
</form>
2. 视图函数
from practise.settings import UPFILE_DIR
from datetime import datetime
import os
from django.shortcuts import render, reverse
from django.http import HttpResponse
def upload(request):
if request.method == 'GET':
return render(request, 'book/fileup.html')
elif request.method == 'POST':
#上传文件对象
f_up_list = request.FILES.getlist('file', None)
if f_up_list:
for f_up in f_up_list:
#实际存储文件目录
day_dir = datetime.now().strftime('%Y%m%d')
save_dir = os.path.join(UPFILE_DIR+'/book', day_dir)
if not os.path.exists(save_dir):
os.mkdir(save_dir)
filename = os.path.join(save_dir, f_up.name)
with open(filename, 'wb') as f:
for line in f_up.chunks():
f.write(line)
return HttpResponse('上传成功')
return HttpResponse("你想干啥??搞事情")
3. 配置文件
UPFILE_DIR = os.path.join(BASE_DIR, 'upfile')
urlpatterns = [
path('upload/', views.upload, name='upload'),
]
4. 项目结构
这是上传了两个文件后的结果
4 web服务
关于一个web服务,以登陆为例展示其流程:
- 客户端向服务器请求登陆页面
- 服务端响应请求,返回登陆页面
- 客户端输入信息开始登陆,发送登陆请求
- 服务端收到请求,返回处理结果
4.1 路由表
urlpatterns = [
path('login/', views.login, name='login')
......
]
4.2 视图函数
def login(request):
if request.method == 'POST':
user = request.POST.get('user', '') #取值
psd = request.POST.get('psd', '')
if user == 'qwe' and psd == 'qwe123':
return index(request) #返回登陆成功的页面
return render(request, 'book/login.html')
4.3 流程
- 客户端发起请求
http://127.0.0.1:8000/book/login
。 - 服务器响应 返回
login.html
。 - 用户在
login.html
完善信息,发送登陆请求。 - 服务器验证,若符合条件,返回成功页面,反之返回登陆页面,继续登陆。
5 HttpResponse ¶
5.1 属性
1.content ¶
表示内容的字节字符串。
In [1]: from django.http import HttpResponse
In [2]: resp = HttpResponse('墨染是最棒的')
In [3]: resp.content
Out[3]: b'\xe5\xa2\xa8\xe6\x9f\x93\xe6\x98\xaf\xe6\x9c\x80\xe6\xa3\x92\xe7\x9a\x84'
2 charset ¶
字符串类型,表示将在其中编码响应的字符集,框架设置默认值。
In [4]: resp.charset
Out[4]: 'utf-8'
3 status_code ¶
该 响应的 HTTP状态代码。
In [5]: resp.status_code
Out[5]: 200
5.2 方法
详情转自: 官方文档
1. init ¶
HttpResponse._init_(content =’’,content_type = None,status = 200,reason = None,charset = None)
content
:迭代器或字符串。如果它是迭代器,会转化为字符串,并且这些字符串将连接在一起以形成响应的内容。content_type
是可选的字符集编码,默认情况下由DEFAULT_CONTENT_TYPE
和DEFAULT_CHARSET
设置形成:“ text / html; charset = utf-8 “。status
是个 响应的 HTTP状态代码。reason
是HTTP响应短语。如果未提供,将使用默认短语。charset
是编码响应的字符集,有默认值。
2. write(content) ¶
此方法创建一个类似文件对象的HttpResponse
实例。
In [6]: resp.write('Tuple')
In [7]: resp.write('是')
In [8]: resp.write('最')
In [9]: resp.write('强')
In [10]: resp.write('的')
In [11]: resp.content.decode()
Out[11]: '墨染是最棒的Tuple是最强的'
- HttpResponse 实例的属性方法类似于一个文件流对象。
3. flush()¶
此方法创建一个类似文件对象的HttpResponse
实例。
不太重要,想了解的去看官方文档,需要下载功能时要用到,但框架底层封装了。
4. set_cookie ¶
HttpResponse.
set_cookie(key,value =’’,max_age = None,expires = None,path =’/’,domain = None,secure = None,httponly = False,samesite = None)
- 设置一个cookie。参数与Python标准库中的cookie对象相同 。
- 常用参数参数只有3个,如下:
- key, value:字符串类型
- max_age:整数,指定秒数后过期。
- expires:
datetime
或timedelta
对象,指定时间过期。现在推荐使用max_age,与max_age二选一。
In [33]: td = datetime(2019, 3, 23, 19, 13, 0, tzinfo
...: =pytz.timezone('Asia/Shanghai'))
In [34]: resp.set_cookie(expires=td, key='name', valu
...: e='jenny')
In [35]: resp.cookies
Out[35]: <SimpleCookie: name='jenny'>
In [36]: str(resp.cookies)
Out[36]: 'Set-Cookie: name=jenny; expires=Sat, 23 Mar 2019 11:11:58 GMT; Max-Age=0; Path=/'
5. delete_cookie ¶
HttpResponse.delete_cookie
(key,path =’/’,domain = None)
使用给定密钥删除cookie。如果密钥不存在,则静默失败,并不抛出异常。
In [37]: resp.delete_cookie('name')
In [38]: resp.cookies
Out[38]: <SimpleCookie: name=''>
In [39]: str(resp.cookies)
Out[39]: 'Set-Cookie: name=""; expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/'
#cookies 被删除,返回了一些无用的默认数据
阅读时欲访问相应官方文档,请点击对应标题旁的符号
¶
↩︎