目录
视图层
django视图层:Django项目下的views.py文件,它的内部是一系列的函数或者是类,用来处理客户端的请求后处理并返回相应的数据
必会三板斧
三板斧
HttpResponse # 返回字符串
render # 返回html页面,并且在返回浏览器之前还可以给html文件传值
redirect # 重定向
三板斧具体详细参数
1.HttpResponse
class HttpResponse(HttpResponseBase):
pass
# 括号内直接跟一个具体的字符串作为响应体
2.render
def render(request, template_name, context=None, content_type=None, status=None, using=None):
# 参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
3.redirect
def redirect(to, *args, permanent=False, **kwargs):
传递要重定向的一个硬编码的URL或者路由
class HttpResponseRedirectBase(HttpResponse):
eg: redirect内部是继承了HttpRespone类
判断下面这句话的对错?
问:用来处理请求的视图函数都必须返回httpResponse对象
答:正确
class HttpResponse:
pass
return HttpResponse()
def render(request, template_name):
return HttpResponse()
return render()
def redirect():
redirect_class =类(祖先有个类是HttpResponse)
return redirect_class()
return redirect()
伪静态(了解)
1.伪静态网页
将一个动态网页伪装成静态网页,将url地址模拟成html结尾的样子,看上去像是一个静态文件。
2.目的
https://www.cnblogs.com/Dominic-Ji/p/9234099.html
伪装的目的在于增大本网站的seo查询力度
并且增加搜索引擎收藏本网站的概率
3.实现伪静态网页
# 将url文件中前缀增加.html即可实现静态网页效果
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]
JsonResponse对象
前后端数据交互需要使用到json作为序列化,实现跨语言数据传输。
1. 混合开发项目:前端页面和后端代码写到一块
2. 前后端分离项目:前端是一个项目,后端是一个项目,后端只需要写接口
前端序列化 后端序列化
JSON.stringify() json.dumps()
JSON.parse() json.loads()
1.json序列化
# 导入模块
import json
def jason_func(request):
# 将后端字典序列化发送到前端
user_dict = {'name':'kimi','age':18}
# 先转成json格式字符串
json_str = user_json=json.dumps(user_dict)
# 将该字段返回
return HttpResponse(user_json)
# ensure_ascii 内部默认True自动转码,改为False不转码,只生成json格式,双引号
2.JsonResponse序列化
# 导入JsonResponse模块
from django.http import JsonResponse
def jason_func(request):
# 将后端字典序列化发送到前端
user_dict = {'name': 'kimi老师', 'age': 18}
# JsonResponse自动编码并返回给前端页面
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
本质看源码:
user_dict,json_dumps_params={'ensure_ascii':False} :解决前端汉字转码问题
上述前端展示
JsonResponse主要序列化字典 针对非字典的其他可以被序列化的数据需要修改safe参数为False(是在前端页面更改的)
如列表
# 列表
l1=[11,22,33,44]
return JsonResponse(l1,json_dumps_params={'ensure_ascii':False},safe=False)
是否可以被序列化看通过json.JSONEncoder 查看源码
request对象获取文件
form表单携带文件类型的数据需要做到以下几点
1.method必须是post
2.enctype必须是multipart/form-data
django后端需要通过request.FILES获取文件类型的数据
views.py
def file_func(request):
# 判断前端请求
if request.method == 'POST':
# 获取POST请求信息
# print(request.POST) # 只能获取普通的键值对数据 文件不行
print(request.FILES) # 获取文件数据(上传)
file_obj = request.FILES.get('file') # (拿到最后一个元素) 文件对象
print(file_obj.name) # 拿到文件名字
# 将文件存起来 先打开文件
with open(file_obj.name, 'wb') as f:
# for循环 一行一行的读取文件内容
for line in file_obj.chunks(): # 推荐加上chunks方法 其实跟不加是一样的都是一行行的读取
# 将文件保存
f.write(line)
# get请求返回
return render(request, 'indexPage.html')
from.py文本
{# 1.method必须指定成post 2.enctype必须换成form-date #}
<h1>获取数据</h1>
<from action="" method="post" enctype="multipart/form-data">
<p>username:
<input type="text" name="username">
</p>
<p>hobby:
<input type="checkbox" name="hobby" value="read">篮球
<input type="checkbox" name="hobby" value="sing">唱歌
<input type="checkbox" name="hobby" value="sleep">睡觉
</p>
<p>file:
<input type="file" name="file">
</p>
<input type="submit" name="选项">
<button>点我</button>
</from>
request对象方法
1.获取请求方式POST/GET
request.method
一个字符串,表示请求使用的HTTP 方法。必须使用大写。
2.request.POST
获取POST请求提交普通的键值对数据 一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成
3.获取GET请求
request.GET
获取GET请求 一个类似于字典的对象,包含 HTTP GET 的所有参数
4.获取文件
request.FILES
一个类似于字典的对象,包含所有的上传文件信息。
FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。
注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会包含数据。否则,FILES 将为一个空的类似于字典的对象。
5.原生的浏览器发过来的二进制数据
request.body
一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,
例如:二进制图片、XML,Json等。
6.拿到路由
request.path
个字符串,表示请求的路径组件(不含域名)
7.拿到路由
request.path_info
8.能过获取完整的url及问号后面的参数
request.get_full_path()
FBV与CBV
FBV
基于函数的视图
def index(request):return HttpResponse对象
CBV
基于类的视图
from django import views
class MyLoginView(views.View):
def get(self, request):
return HttpResponse('from CBV get function')
def post(self, request):
return HttpResponse('from CBV post function')
path('login/', views.MyLoginView.as_view())
会自动根据请求方法的不同自动匹配对应的方法并执行
CBV源码解析
1.从CBV的路由匹配切入
path('login/', views.MyLoginView.as_view())
1.类名点名字(名字的查找问题)
2.类名点名字并加括号调用(静态方法、绑定给类的方法)
2.函数名加括号执行优先级最高 项目一启动就会自动执行as_view方法
path('login/', views.view) # CBV路由本质还是FBV
3.浏览器地址栏访问login路由需要执行view函数
1.产生我们自己编写类的对象
2.对象调用dispatch方法(注意查找顺序)
4.研究父类中的dispatch方法
获取当前请求方法并转小写 之后利用反射获取类中对应的方法并执行
class View:
@classmethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
handler = getattr(self, request.method.lower())
return handler(request, *args, **kwargs)
模板层
"""
{{}}:主要与数据值相关
{%%}:主要与逻辑相关
django的模板语法是自己写的 跟jinja2不一样
1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的 {##}
3.
"""
1.模板语法传值
return render(request, 'demo02.html', {'n1': name, 'a1': age}) # 传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
return render(request,'demo02.html', locals()) # 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源
2.模板语法传值特性
1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象则不会
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用
3.模板语法之过滤器(内置函数)
标签:return,request,视图,Django,json,模板,HttpResponse,def
From: https://www.cnblogs.com/zhanglanhua/p/16980787.html