Django–视图层
1 视图函数
一个视图函数是一个简单的python函数,它接受Web请求并返回Web响应。响应可以是一张网页的HTML内容,一个重定向、一个404错误或一张图片。
视图层应掌握两个对象:请求对象(request)和 响应对象(HttpResponse)
2 Request对象
form表单,不写method,默认是get请求
(1)什么情况下用get:请求数据,请求页面
(2)什么情况下用post:向服务器提交数据
request属性
掌握:
1.request.GET
一个类似于字典的对象,包含 HTTP GET 的所有参数。
2.request.POST 一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。 POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。 因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST" 另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。 注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用: request.POST.getlist("hobby") 3.request.body 一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。 但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。 4. 路径:http://127.0.0.1:8000/index/xxxx/?name=hanl&password=123
request.path
一个字符串,表示请求的路径组件(不含域名、内容) /index/xxxx/
request.get_full_path() 表示全路径(包含内容) /index/xxxx/?name=hanl&password=123
5.request.method (请求类型) 一个字符串,表示请求使用的HTTP 方法。必须使用大写。 例如:"GET"、"POST"
7.request.FILES(*****) 一个类似于字典的对象,包含所有的上传文件信息。 FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。 注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会 包含数据。否则,FILES 将为一个空的类似于字典的对象。
-----------------------------------------------------------------------------------------------------
了解:
8.request.META 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例: 取值: CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。 CONTENT_TYPE —— 请求的正文的MIME 类型。 HTTP_ACCEPT —— 响应可接收的Content-Type。 HTTP_ACCEPT_ENCODING —— 响应可接收的编码。 HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。 HTTP_HOST —— 客服端发送的HTTP Host 头部。 HTTP_REFERER —— Referring 页面。 HTTP_USER_AGENT —— 客户端的user-agent 字符串。 QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。 REMOTE_ADDR —— 客户端的IP 地址。 REMOTE_HOST —— 客户端的主机名。 REMOTE_USER —— 服务器认证后的用户。 REQUEST_METHOD —— 一个字符串,例如"GET" 或"POST"。 SERVER_NAME —— 服务器的主机名。 SERVER_PORT —— 服务器的端口(是一个字符串)。 从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时, 都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_ 前缀。 所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。 6.request.encoding 一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。 这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。 接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。 如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
9.request.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
3 HttpResponse对象
响应对象主要有三种方式:
- HttpResponse()
- render()
- redirect()
HttpResponse()括号内直接跟一个具体的字符串作为响应体
render()
render(request, template_name[, context])
如:render(request,'book_list.html',{'book_list':book_list})
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
redirect
重定向
redirect(‘/index/’)
也可以是一个完整的URL:
redirect('http://www.baidu.com/')
重定向301和302的区别:
都表示重定向,就是浏览器在拿到服务器的这个状态码后会自动跳转到一个新的URL
(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。
他们不同在于:
301表示就地址A的资源已经被永久移除(这个资源不可以访问了),
搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;
302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓 取新的内容而保存旧的网址。
4 JsonResponse
想前端返回一个json格式字符串的两种方式:
方式一:
dic={'name':'byz','age':18} li=[1,2,3,4] return HttpResponse(json.dumps(li))
方式二: from django.http import JsonResponse
dic={'name':'byz','age':18}
return JsonResponse(dic,safe=False)
5 CBV和FBV
CBV基于类的视图(Class base view)和FBV基于函数的视图(Function base view)
from django.views import View class AddPublish(View): def dispatch(self, request, *args, **kwargs): print(request) print(args) print(kwargs) # 可以写类似装饰器的东西,在前后加代码 obj=super().dispatch(request, *args, **kwargs) return obj def get(self,request): return render(request,'index.html') def post(self,request): request return HttpResponse('post')
6 简单文件上传
1 <form action="" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="name"> 密码:<input type="text" name="password"> 文件:<input type="file" name="myfile"> <input type="submit"> </form> #enctype="multipart/form-data"*******************重点 #<input type="file" name="myfile">****一定要指定name 2 # ff是一个文件对象,django封装的 ff=request.FILES.get('myfile') # 文件对象的名字 file_name=ff.name from django.core.files.uploadedfile import InMemoryUploadedFile print(type(ff)) with open(file_name,'wb') as f: for line in ff.chunks(): f.write(line) return HttpResponse('ok)