Django之视图层views
1、视图函数
就是一个简单的python函数,它接收web请求并返回web响应,如:
# 一个简单的视图函数 # views.py 文件下 from django.shortcuts import render, HttpResponse, redirect import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
2、视图函数返回的三个对象
|
返回函数
|
说明
|
示例
|
|
HttpResponse
|
返回字符串
|
return HttpResponse("Hello World!!!")
|
|
render
|
支持模板语法,渲染页面,
并返回给前端
|
return render(
request,
"user.html",
{"name": "sun", "age": 24}
)
|
|
redirect
|
重定向(既可以定向别人的网址,又可以是自己的网址)
|
return redirect("/index/")
return redirect("www.baidu.com")
|
3、JsonResponse对象
json格式数据(前后端之所以能分离是因为json数据格式做支撑)
往前端返回数据有两种方式
import json from django.http import JsonResponse # 不包括中文汉字传输数据 lis = ("abc", 123, "123456") dic = {"name": "sun", 'age': 24} # 第一种方式 # return HttpResponse(json.dumps(lis)) # return HttpResponse(json.dumps(dic)) # 第二种方式: return JsonResponse(lis, safe=False) # safe=True, 只能字典传输,默认是True return JsonResponse(dic) # 结果是: ["abc", 123, "123456"] # 结果是:{"name": "sun", "age": 24}
若返回的json格式中有汉字如何解决
# 当出现汉字时: lis = ("abc", 123, "123456", "孙小二") dic = {"name": "孙小二", 'age': 24} # 结果是:["abc", 123, "123456", "\u5b59\u5c0f\u4e8c"] # 结果是:{"name": "\u5b59\u5c0f\u4e8c", "age": 24} # 解决办法 # 第一种方式的解决办法: return HttpResponse(json.dumps(lis, ensure_ascii=False)) return HttpResponse(json.dumps(dic, ensure_ascii=False)) # 说明:查看源码 # 点进json可以查看ensure_ascii的用处: # Flase,返回的值就不包含ascii编码 # 第二种方式的解决办法: return JsonResponse(lis, safe=False, json_dumps_params={"ensure_ascii": False}) return JsonResponse(dic, json_dumps_params={"ensure_ascii": False}) # 说明:查看源码 # 点进JsonResponse可以查看json_dumps_params的作用 # 结果是:["abc", 123, "123456", "孙小二"] # 结果是:{"name": "孙小二", "age": 24}
4、FBV与CBV
FBV:基于函数的视图,即视图函数
CBV:基于类的视图
CBV创建方式: # 1.在路由层加入as_view urlpatterns = [ url(r"^login", view.login.as_view()), ] # 在views.py下创建类 from django.views import View class Login(View): def get(self, request): pass def post(self, request): pass def dispatch(self, request, *args, **kwargs): print("before") obj = super(Login, self).dispatch(request, *args, **kwargs) print("after") return obj # dispatch 的作用: # 执行url请求之前,先执行dispatch,使用反射getatter()进行请求分配。 # 在Login中增加自己的dispatch,起到类似于装饰器作用,可以自定义一些操作 # 描述CBV执行过程: # 当URL请求经过路由系统时,就会立即执行Login.as_view()函数,as_view是一个闭包函数, # 返回的是内部的view函数,请求到达视图层时,执行view()函数,即执行dispatch函数, # dispatch函数内通过getattr反射,找到我们定义的get或post函数,并执行,最后返回请求响应
5、文件上传
前端注意点:
form表单method必须是post
enctype必须是multipart/form-data
后端:
获取上传文件的对象:request.FILES.get("file_name")
获取上传文件的文件名:request.FILES.get("file_name").name
示例: # 获取文件对象,即文件句柄 file_obj = request.FILES.get('myfile') # print(file_obj.name) # 获取文件名 file_name = file_obj.name # 文件读写操作 with open(file_name,'wb') as f: # for line in file_obj: for line in file_obj.chunks():0 f.write(line)
6、request 属性
1.request.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。 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.request.path,或request.path_info 一个字符串,表示请求的路径组件(不含域名)。 例如:url: "127.0.0.1:8080/login/", request.path的返回值"/login/" 5.request.get_full_path() 一个字符串,表示请求的路径组件, 可以获取get方式传的参数 例如:url: "127.0.0.1:8080/login/?id=1", request.get_full_path的返回值"/login/?id=1" 6.request.method 一个字符串,表示请求使用的HTTP 方法。必须使用大写。 例如:"GET"、"POST" 7.request.encoding 一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。 这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。 接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。 如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。 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 键。 9.request.FILES 一个类似于字典的对象,包含所有的上传文件信息。 FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。 注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会 包含数据。否则,FILES 将为一个空的类似于字典的对象。 10.request.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。 11.request.session 一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。

浙公网安备 33010602011771号