Django进阶--请求与响应

Django进阶–请求与响应 1

1 Django服务流程


2 HttpRequest

服务器接收到http协议的请求后,会根据报文创建HttpRequest对象。视图函数的第一个参数(request)就是HttpRequest对象,框架在django.http模块中定义了HttpRequest对象的API

2.1 HttpRequest对象属性

  1. path
    返回该请求的URL的完整路径的字符串,不包括参数或域名。

    >>request.path
    result = {str}'/book/retest/9/'
    

  2. method
    返回请求中使用的HTTP方法的字符串。返回结果是大写的。例如:

    >>request.method
    result = {str}'GET'
    

  3. encoding

    以字符串形式返回表单提交数据的当前编码方式(值为None,表示使用该DEFAULT_CHARSET设置)。您可以写入此属性以更改访问表单数据时使用的编码。任何后续属性访问(例如从GET或读取POST)都将使用新encoding值。如果您知道表单数据不在DEFAULT_CHARSET 编码中,则非常有用。

    >>request.encoding
    result = {NoneType}None
    
    #设置值为utf-8后
    result = {str}'utf-8'
    

  4. GET
    返回字典对象,包含所有给定的HTTP GET参数。

    在这里插入图片描述

    • QueryDict类型的对象
    • 包含get请求方式的所有参数
    • 与url请求地址中的参数对应,位于?后面
    • 参数的格式是键值对,如key1=value1
    • 多个参数之间,使用&连接,如key1=value1&key2=value2

  5. POST
    包含所有给定的HTTP POST参数,前提是请求包含表单数据。

在这里插入图片描述

  • 如果需要访问请求中发布的原始或非表单数据,请通过该HttpRequest.body属性访问该数据

  • POST它不包含文件上传信息。

  • QueryDict类型的对象

  • 包含post请求方式的所有参数

  • 与form表单中的控件对应

  • 表单中控件要有name属性,则name属性的值为键,value属性的值为值,构成键值对提交

  • 对于checkbox控件,name属性一样为一组,当控件被选中后会被提交,存在一键多值的情况


  1. session

    返回类似字典对象,表示当前会话,Django开启会话支持才能使用。


  2. COOKIES
    返回标准字典对象,表示cookies,键和值均为字符串。后面同session做详细介绍,本篇不论。


  3. is_ajax()
    返回bool值,通过XmlHttpRequest对象(ajax)访问的返回True。

    >>request.is_ajax()
    result = {bool} False
    

  4. 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. 配置文件

settings.py

UPFILE_DIR = os.path.join(BASE_DIR, 'upfile')

urls.py

urlpatterns = [
    path('upload/', views.upload, name='upload'),
]

4. 项目结构

在这里插入图片描述

这是上传了两个文件后的结果


4 web服务

关于一个web服务,以登陆为例展示其流程:

  1. 客户端向服务器请求登陆页面
  2. 服务端响应请求,返回登陆页面
  3. 客户端输入信息开始登陆,发送登陆请求
  4. 服务端收到请求,返回处理结果

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 流程

  1. 客户端发起请求http://127.0.0.1:8000/book/login
  2. 服务器响应 返回login.html
  3. 用户在login.html完善信息,发送登陆请求。
  4. 服务器验证,若符合条件,返回成功页面,反之返回登陆页面,继续登陆。

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 = Nonestatus = 200reason = Nonecharset = None

  • content:迭代器或字符串。如果它是迭代器,会转化为字符串,并且这些字符串将连接在一起以形成响应的内容。
  • content_type是可选的字符集编码,默认情况下由DEFAULT_CONTENT_TYPEDEFAULT_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(keyvalue =’’max_age = Noneexpires = Nonepath =’/’domain = Nonesecure = Nonehttponly = Falsesamesite = None)

  • 设置一个cookie。参数与Python标准库中的cookie对象相同 。
  • 常用参数参数只有3个,如下:
  • key, value:字符串类型
  • max_age:整数,指定秒数后过期。
  • expires:datetimetimedelta对象,指定时间过期。现在推荐使用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_cookiekeypath =’/’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 被删除,返回了一些无用的默认数据

  1. 阅读时欲访问相应官方文档,请点击对应标题旁的符号 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值