视图层
常用三板斧
"""
HttpResponse
返回字符串类型
render
返回html页面 并且在返回给浏览器之前还可以给html文件传值进行渲染
redirect
重定向 告知浏览器访问新的URL
"""
# 视图函数必须要返回一个HttpResponse对象 研究三者的源码即可得处结论
The view app01.views.index didn't return an HttpResponse object. It returned None instead.
# render简单内部原理
from django.template import Template,Context
res = Template('<h1>{{ user }}</h1>')
con = Context({'user':{'username':'jason','password':123}})
ret = res.render(con)
print(ret)
return HttpResponse(ret)
# redirect源码相对复杂,但通过查看其继承关系可知最终返回的仍是HttpResponse对象
JsonResponse对象
JsonResponse是一种特殊的HTTPResponse对象
"""
json格式的数据有什么用?
前后端数据交互需要使用到json作为过渡 实现跨语言传输数据
前端序列化
JSON.stringify() json.dumps()
JSON.parse() json.loads()
"""
import json
from django.http import JsonResponse
def ab_json(request):
user_dict = {
'username':'jason好帅哦,我好喜欢!',
'password':'123',
'hobby':'girl'
}
l = [111,222,333,444,555]
# 先转成json格式字符串
# json_str = json.dumps(user_dict,ensure_ascii=False)
# 将该字符串返回
# return HttpResponse(json_str)
# 读源码掌握用法
return JsonResponse(
user_dict,json_dumps_params={'ensure_ascii':False}
)
# In order to allow non-dict objects to be serialized set the safe parameter to False.
# return JsonResponse(l,safe=False)
# 默认只能序列化字典 序列化其他需要加safe参数
FBV与CBV
"""
视图函数即可以是函数也可以是类
"""
# FBV
def index(request):
return HttpResponse('OK')
# CBV
from django.views import View
"""只要是处理业务逻辑的视图函数 形参里面肯定要有request"""
class MyClass(View):
def get(self,request):
return HttpResponse('get请求')
def post(self,request):
return HttpResponse('post请求')
# 注意 CBV路由匹配写法跟FBV有点不一样(但是其实本质是一样的)
url(r'^login/$',views.MyClass.as_view())
源码分析过程(源码请在pycharm中查看,这里就不贴了)
1、Myclass.as_view()执行优先级最高先执行,查找Myclass中没有as_view方法,则提升一层到其父类View中寻找。
2、在父类View中寻找成功,根据as_view()类方法的定义执行后,返回view函数。
则路由层传递的参数 由view函数接收;因为发生调用是Myclass.as_view()所以此时cls就是Myclass类
3、在view函数执行过程中,先生成一个Myclass类的实例(为了后面讲解方便,
暂时叫实例A),然后将view函数接收的参数赋值给这个实例A,最终返回
A.dispatch(request, *args, **kwargs)
4、实例A中寻找不到dispatch方法,其父类Myclass中也没有,再上一层在View类
中寻找到。根据dispatch中的定义执行实例A.dispatch方法:先判断实例A接收到
的request.method.lower()是否属于View中设置的http_method_names,如果属于
就将实例A中的名字为request.method.lower()的方法返回。即最后执行Myclass中定义名字为request.method.lower()的方法。
实例A属于Myclass类,在Myclass类中定义了get和post方法。
# CBV与FBV在路由匹配上本质是一样的 都是路由 对应 函数(方法)内存地址
request对象
"""
request.method 获取request的方法
request.POST 获取request通过POST方法传递来的键值对数据
request.GET 获取request通过GET方法传递来的键值对数据
request.FILES 获取request传递的文件数据
request.body # 原生的浏览器发过来的二进制数据 后面详细的讲
request.path 获取url路径
request.path_info
request.get_full_path() 能过获取完整的url及问号后面的参数
"""
print(request.path) # /app01/ab_file/
print(request.path_info) # /app01/ab_file/
print(request.get_full_path()) # /app01/ab_file/?username=jason