• python的Web框架,Django框架中的请求与响应


    请求与响应

    简单流程图

    我们先来了解一个请求与响应的大概流程 image

    视图函数接受到的request到底是个什么对象呢?

    服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest对象在django.http模块中定义了HttpRequest对象的API,下面我们来列出这个对象的方法。

    request属性说明
    path 一个字符串,表示请求页面的完整路径,不包括域名
    method 一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'
    *encoding 一个字符串,表示提交的数据的编码方式,
    GTE 一个类似于字典的对象,包含get请求方式的所有参数
    POST 一个类似于字典的对象,包含post请求方式的所有参数
    FILES 一个类似于字典的对象,包含所有的上传文件
    COOKIES 一个标准的python字典,包含所有的cookie,键和值都为字符串
    sessin 一个即可读有可写的类似字典的对象,表示当前的会话,只有当Django启动会话的支持时才可用,详细内容见"状态保存"
    方法:is_ajax() 如果请求是通过XMLHttpRequest发起的,则返回True

    *encoding:如果为None则表示使用浏览器的默认设置,一般为utf-8,这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值

    POST登录提交的html例子

    html中的form表单解析

    1  <form action="提交地址,为空为当前页" method="默认为POST请求">
    2     
    3         # 如果是post请求,会有安全的问题,需要加上csrf的方法,才可以使用post请求。
    4         {% csrf_token %}
    5         
    6         <p>用户名:<input type="text" name="必须要给的属性,用于后台获取参数得到的key"></p>
    7         <p>密码:<input type="password" name="必须要给的属性,用于后台获取参数得到的key"></p>
    8         <p>用户名:<input type="submit" value="登录"></p>
    9     </form>

    views中的简单逻辑判断写法:

    因为登录页面有GET请求,也有POST的请求,所以需要再视图的时候需要进行判断,做出反应。

     1 def login(request):
     2 
     3     if request.method =='POST'
     4     
     5         # userame和password 这个key是前端网页传过来的类似的字典方式。
     6         username = request.POST.get('username','')
     7         password = request.POST.get('password','')
     8         
     9         # 如果账号和密码是对的,则跳转到首页
    10         if username == 'aaa' and password == '123456':
    11             return redirect(reverse('teacher:index'))
    12         else:
    13             此处添加账户密码错误的返回结果
    14 
    15     # 如果是GET方法则把login页面返回过去
    16     return render(request, 'teacher/login.html')

    get以及post方式访问如何的获取多个参数

    当网页是get访问的时候,且是多个参数的时候,取值是什么样的呢。

    访问的网页url例子:
    http://127.0.0.1:8000/teacher/login/?hobby=篮球&hobby=足球&hobby=羽毛球

    正常的取值方法,只能获取到一个值

    #一键多值的情况下,只能拿到一个值
    >>> request.GET.get('hobby')
    '羽毛球'

    getlist:拿多个值的时候,需要getlist

    >>> request.GET.getlist('hobby')
    ['篮球','足球','羽毛球']
    POST方法相同,只需要修改'GET''POST'即可。
    

    文件上传

    需要设置上传文件存放的路径,setting中设置,同时需要新建文件夹。

    1 #测试用的,名字可以随意取,暂时路径为根目录下的文件夹。
    2 UPLOAD_ROOT = os.path.join(BASE_DIR,'upload')

    html中form的基础写法

    1 <form action="" method="post" enctype="multipart/form-data">
    2     {% scrf_token %}
    3     <p>请选择你要上传的文件:<input type="file" name="file" multiple></p>
    4     <p><input type="submit" value="上传"></p>
    5 </form>
    6 
    7 enctype="multipart/form-data":只有form表带拥有这个属性的时候,才有上传文件的功能
    8 multiple:选择文件需要带有才可以上传多个文件

    配置view: 判断file,如果有文件,则创建文件夹(文件夹名为当天日期)

     1 from datetime import datetime
     2 from crm.setting import UPLOAD_ROOT
     3 import os
     4 
     5 def upload(request):
     6     if request.method == 'POST':
     7         files = request.FILES.getlist('file', None)
     8         #如果有多个文件,则循环取出,
     9         for file in files:
    10             #文件名
    11             day_dir = datetime.noe.strftime('%Y%m%d')
    12             #绝对路径拼接
    13             pre_dir = os.path.join(UPLOAD_ROOT,day_dir)
    14                 
    15             #判断文件夹是否存在,需要注意当前用户是否有权限
    16             if not os.path.exists(pre_dir):
    17                 os.mkdir(pre_dir)   #如果不存在则创建文件夹
    18                 
    19             # 拿到用户上传过来的文件名,和路径拼接
    20             filename = os.path.join(pre_dir, file.name)
    21                 
    22             # 写数据(二进制)
    23             with open(filename, 'wb') as f:
    24                 #chunks是一个以文件流的形式取值。如果文件较大,以read的方式取值则会耗费资源。
    25                 for line in file.chunks():
    26                     f.write(line)
    27             return HttpResponse('上传成功')
    28             
    29     return render(request, 'teacher/upload.html')
     

    HTTPResponse对象:

    from django.http import HttpResponse
    属性作用
    content 表示返回的内容,字节类型
    charset 表示response采用的编码字符集,字符串类型
    status_code 响应的HTTP响应状态码
    content-type 指定输出的MIME类型,请求头
    方法 作用
    init 使用页内容实例化HttpResponse对象
    write(content) 以文件的方式写,可以分次写
    flush() 以文件的方式输出缓存区
    set_cookie(key, value='', max_age=None, expires=None) 设置Cookie
    key、value 都是字符串类型
    max_age 是一个整数,表示在指定数秒后过期
    expires 是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期。
    max_age与expires二选一 max_age与expires二选一,如果不指定过期时间,则关闭浏览器就失效
    deleta_cookie(key) 删除指定的key的cookie,如果key不存在则数秒也不发送

    *expires:注意datetime和timedelta值只有在使用PickleSerializer时才可序列化。

    JsonResponse 返回json数据,只能接受字典类型

    如何返回一个json数据,这里先演示一个查询数据的接口
    1 def students_api(request):
    2     sex = request.GET.get('sex','')
    3     sex = int(sex)
    4     res = Students.objects.values('name','age','sex','phone').filter(sex=sex)
    5     res = dect('data':res)
    6     return JsonResponse(res)

     

  • 相关阅读:
    云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)
    Kindle 中文阅读终极优化指南
    编辑距离
    在IE中输入网址不能访问,但输入IP地址可以访问,为什么?
    英文缩写解释
    为什么有时上网速度很慢?
    常用命令
    如何使用ping命令检查网络故障
    密码的故事
    提示主机名冲突怎么办?
  • 原文地址:https://www.cnblogs.com/hua888/p/10469663.html
Copyright © 2020-2023  润新知