三、django的视图层

视图层

常用三板斧

"""
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值