视图层三板斧
三板斧
- HttpResponse
- 返回字符串类型的数据
- render
- 返回HTML文件
- redirect
- 重定向
【一】JSonResponse
- 路由配置
# urls.py文件
from django.urls import path
from a9902 import views
urlpatterns = [
path('json_data/',views.json_data),
# http://127.0.0.1:8686/json_data/
]
【1】json模块序列化
# views.py
import json
from django.shortcuts import render, HttpResponse
def json_data(request):
user = {
'name': 'mao', 'age': '18', 'slary': '100'
} # 先转换成json格式的字符串
json_str = json.dumps(user)
# 将该字符串返回
return HttpResponse(json_str,'dasdasd')
- 这种只能输出字符串类型
【2】JsonResponse对象
from django.http import JsonResponse
def json_data(request):
user = {
'name': 'mao', 'age': '18你妈更年期了', 'slary': '100w回家等死就好了'
} # 先转换成json格式的字符串
# 将该字符串返回
# 查看JsonResponse的源码
return JsonResponse(user, json_dumps_params={'ensure_ascii': False})
-
这里字典序列化就可以显示出来了
-
那么用上面的方法列表序列化? ×
from django.http import JsonResponse
def json_data(request):
# user = {
# 'name': 'mao', 'age': '18你妈更年期了', 'slary': '100w回家等死就好了'
# } # 先转换成json格式的字符串
list = [1,2,3,4,5,6,7,8,9,100]
# 将该字符串返回
# 查看JsonResponse的源码
return JsonResponse(list, json_dumps_params={'ensure_ascii': False})
# In order to allow non-dict objects to be serialized set the safe parameter to False.
# 为了允许序列化非 dict 对象,请将 safe 参数设置为 False。
# 改成这样就行了
return JsonResponse(list, safe=False)
- 其他也是同理将safe= False 就行了
【2】表单的上传与下载
- form表单上传文件类型的数据
- method必须指定成post
- enctype必须换成formdate
# urls.py
from a9902 import views
urlpatterns = [
# JsonResponse
path('json_data/',views.json_data),
# from表单上传文件
re_path(r'^file/',views.user_file),
]
# views.py文件
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
def user_file(request):
if request.method == 'POST':
# print(request.POST) # 只能获取普通的键值对数据 文件不行!!
print(request.FILES) # 获取文件数据
# < MultiValueDict: {'file': [ < InMemoryUploadedFile: 【1】什么是视图.md(application / octet - stream) >]} >
file_obj = request.FILES.get('file') # 文件对象
print(file_obj.name)
with open(file_obj.name,'wb') as f:
for i in file_obj:
f.write(i)
return render(request,'user_from.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data">
<p>username: <input type="text" name="username"> </p>
<p>file: <input type="file" name="file"></p>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
【3】常用的request对象方法
以下是一些常用的request
对象方法和属性:
request.method
: 请求的HTTP方法,例如GET
、POST
、PUT
等。request.GET
: 包含GET请求参数的字典,可以通过键访问参数值。request.POST
: 包含POST请求参数的字典,可以通过键访问参数值。request.FILES
: 包含上传文件的字典,可以通过键访问文件对象。request.path
: 请求的路径部分,不包括域名和查询参数。request.get_full_path()
: 请求的完整路径,包括域名、路径和查询参数。request.is_secure()
: 判断请求是否通过HTTPS协议发送。request.session
: 请求的会话对象,用于在请求之间存储和访问数据。request.COOKIES
: 包含请求中所有Cookie的字典,可以通过键访问Cookie值。request.user
: 包含当前经过身份验证的用户对象。
这里只是一部分您可以参考Django官方文档中有关request
对象的更多信息:
https://www.djangoproject.com/start/overview/
【二】cbv源码
【1】什么是查找顺序
对象属性的查找顺序:
- 首先在对象自身的命名空间(属性字典)中查找属性。
- 如果在对象自身的命名空间中没有找到,则会向上查找该对象的类(class)的命名空间,直到找到对应的属性或达到类的顶层(通常是 object 类)。
方法的查找顺序:
- 首先在对象自身的类中查找方法,并调用该方法。
- 如果在对象自身的类中没有找到方法,则会按照对象的类继承关系(即 MRO,Method Resolution Order)来查找方法,确保子类的方法优先于父类的方法被调用。
【2】如何看cbv源码
需要看源码。 在看python源码的时候 一定要时刻提醒自己面向对象属性方法查找顺序
- 先从对象自己找
- 再去产生对象的类里面找
- 之后再去父类找
总结: 看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁
cbv的源码 : 突破口在urls.py
from django.contrib import admin
from django.urls import path,re_path
from app01 import views
urlpatterns = [
# CBV源码
re_path('r^login/',views.MyLogin.as_view()),
]
# re_path('r^login/',views.view), 这里CBV跟FBV 一模一样
# '''这里可以看出CBV跟FBV在路由匹配上本质是一样的 都是路由 对应 函数内存地址'''
# 函数名/方法名 加括号优先级最高
# 这里我们可以假设一下
as_view()
要么是被@staticmethod修饰的静态方法
要么是被@classmethod修饰的类的方法 ✓
@classonlymethod
def as_view(cls, **initkwargs):
"""Main entry point for a request-response process."""
for key in initkwargs:
pass
# cls 就是我们自己写的类 MyCBV
def view(request, *args, **kwargs):
# cls 就是我们自己写的类
# self = MyLogin(**initkwargs) 产生一个我们自己写的类的对象
self = cls(**initkwargs)
self.setup(request, *args, **kwargs)
'''
需要看源码。 在看python源码的时候 一定要时刻提醒自己面向对象属性方法查找顺序
- 先从对象自己找
- 再去产生对象的类里面找
- 之后再去父类找
总结: 看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁
'''
# CBV的精华
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
# 获取的当前请求的小写格式 如何对比当前请求方式是否合法
# get请求为例子
# post请求
if request.method.lower() in self.http_method_names:
handler = getattr(
self, request.method.lower(), self.http_method_not_allowed
)
'''
反射:通过字符串来操作对象的数学或者方法
handler = getattr(自己写的类产生的对象,'get',当找不到get数学或者方法的时候机会用到第三个参数)
handler = 我们自己写的类里面的get方法
'''
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
'''自动调用get方法'''
1
2
3
4
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
‘’‘自动调用get方法’‘’
### 1
[外链图片转存中...(img-G76z1kFi-1712142225262)]
### 2
[外链图片转存中...(img-r75dM41E-1712142225262)]
### 3
[外链图片转存中...(img-K0Za3Aud-1712142225262)]
### 4
![image-20240229230949408](https://img-blog.csdnimg.cn/img_convert/248107e539bdba70c3ca3f8a06d4da04.png)