请求与相应
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