请求与相应

请求与相应


 

HttpRequest的常用属性和方法

  • path:一个字符串,表示请求的页面的完整路径,不包括域名
  • method: 一个字符串,表示请求使用的的HTTP方法,常用值包括:'GET', 'POST'。
  • encoding:一个字符串,表示提交的数据的编码方式
    • 如果为None则表示使用浏览器的默认设置,一般为utf-8
    • 这个属性是可以写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值
  • GET: 一个类似字典的对象,包含get请求方式的所有参数
  • POST: 一个类似字典的对象,包含post请求的所有参数
  • FILES: 一个类似字典的对象,包含所有的上传文件
  • COOKIES: 一个标准的python字典,包含所有的cookie,键和值都为字符串
  • session:一个既可读又可写的类似字符串的对象,表示当前的会话,只有当django启用会话的支持时才可用。
  • is_ajax(): 如果请求是通过XMLHttpRequest发起的,则返回True。

 

csrf_token

  • CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式
  • django为了解决这种攻击机制,增加了csrf_token验证。一般会在form表单里面加上模板标签{% csrf_token %}生成csrf_token,便于后台验证。
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8     <h1>login</h1>
     9 
    10     <form action="" method="post" >
    11         {% csrf_token %}
    12         <p>用户名<input type="text" name="username"></p>
    13         <p>密码<input type="password" name="password"></p>
    14         <p><input type="submit" value="提交"></p>
    15     </form>
    16 </body>
    17 </html>

    form表单插入csrf_token

     1 from django.shortcuts import render, HttpResponse, redirect, reverse
     2 
     3 
     4 def login(request):
     5     if request.method == 'POST':
     6         username = request.POST.get('username', '')
     7         password = request.POST.get('password', '')
     8         print(username, password)
     9         if username == 'admin' and password == '123':
    10             return redirect(reverse('crm:index'))
    11     return render(request, 'crm/login.html')

    登录视图函数

  • 禁用csrf:@csrf_exempt

 

捕捉请求参数

  • request.GET.get(key):捕捉一个参数的单个值.
  • request.GET.getlist(key):捕捉一个参数的总值数,一键多值型号    //value=math&value=Chinese&value=English.

 

文件上传

  • 设置存储路径
    • 在项目的根目录下新建upload文件夹.
    • 在settings里面设置: UPLOAD_ROOT = os.path.join(BASE_DIR, 'upload').
  • 简单前端页面
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8     <h1>文件上传</h1>
     9     <form action="" method="post" enctype="multipart/form-data">
    10         {% csrf_token %}
    11         <input type="file" name="file" >
    12         <input type="submit">
    13     </form>
    14 </body>
    15 </html>
  • 后台处理
     1 from django.shortcuts import render, HttpResponse, redirect, reverse
     2 import os
     3 from untitled4.settings import UPLOAD_ROOT
     4 
     5 def upload(request):
     6     from datetime import datetime
     7     if request.method == 'POST':
     8         files = request.FILES.get('file', None)
     9         if files:
    10             dirs = datetime.now().strftime('%Y%m%d')
    11             current_dir = os.path.join(UPLOAD_ROOT, dirs)
    12             if not os.path.exists(current_dir):
    13                 os.mkdir(current_dir)
    14             file_name = os.path.join(current_dir, files.name)
    15             with open(file_name, 'wb') as f:
    16                 for line in files.chunks():
    17                     f.write(line)
    18             return HttpResponse('上传成功!')
    19     return render(request, 'crm/upload.html')
  • 长传多个文件只需将get方法换成getlist,然后在逐一遍历返回的列表即可。

 

HttpResponse对象

  • 属性:
    • content:表示返回的内容,字节类型
    • charset:表示response采用的编码的字符集,字符串类型
    • status_code:响应的HTTP响应的状态码
    • content_type:指定输出的MIME类型
  • 方法:
    • init:使用页内容实例化HttpResponse对象
    • write(content):以文件的方式写
    • flush():以文件的方式输出缓存区
    • set_cookie(key, value="", max_age=None, expire=None)  // 设置cookie
    • key、value都是字符串类型
    • max_age是一个整数,表示在数秒后过期
    • expire是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期,注意datetime或timedelta值只有在使用PickleSerializer时才可序列化
    • max_age与expires二选一
    • 如果不指定过期时间,则关闭浏览器就失效
    • delete_cookie(key):删除指定的key的cookie,如果key不存在则什么也不发生。
  • 对象:
    • render
    • redirect
    • reverse
    • JsonResponse

 

posted @ 2019-04-08 16:50  Ivy丶  阅读(277)  评论(0编辑  收藏  举报