嘘~ 正在从服务器偷取页面 . . .

DJango 学习(9)—— 视图层介绍


视图层

三板斧

"""
HttpResponse
    返回字符串类型

render
    返回 HTML 页面 并且还可以给 html 页面传值

redirect
    重定向
    
    
视图函数必须要返回一个 HttpResponse


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

JsonResponse对象

"""
json 格式的数据的作用
    前后端数据交互需要 json 作为过渡 实现跨语言传输数据
    
"""
# 前端序列化
    JSON.stringify()
    JSON.parse()

# 给前端浏览器返回一个 json 格式的字符串
from django.http import JsonResponse

def ab_json(request):
    user_dict = {
        "username": "aoteman奥特曼",
        "password": "123"
    }

    l = [111, 222, 333]

    # return JsonResponse(user_dict) # 会 “乱码”

    # return JsonResponse(user_dict, json_dumps_params={"ensure_ascii": False})

    return JsonResponse(l, safe=False)

文件上传以及获取

"""
form 表单上传文件
    1. method 必须为 post
    2. enctype 必须换成 form-data
"""
def ab_file(request):
    if request.method == "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 line in file_obj.chunks():
                f.write(line)

    return render(request, "form.html")

request 对象方法

"""
request.GET
request.POST
request.method
request.FILES

request.path # 只拿到路由
request.path_info
request.get_full_path # 不仅拿到路由,还包括问好后面的参数

request.body # 原生浏览器发送的二进制数据
"""

FBV 和 CBV

# 视图函数既可以是函数也可以是类

# CBV
from django.views import View

class MyLogin(View):
    def get(self, request):
        return render(request, "form.html")
    def post(self, request):
        return HttpResponse("post方法")
    
urls(r"^cbv/", views.MyLogin.as_view())

"""
两者各有千秋

CBV 特点
    能够直接根据请求方式的不同直接匹配到对应的方法执行
"""

CBV源码剖析

views.MyLogin.as_view()

"""
函数名/方法名  加括号执行优先级最高
猜测
    as_view()
        要么是被@staticmethod 修饰的静态方法
        要么是被@classmethod 修饰的类方法
    
    @classonlymethod
    def as_view(cls, **initkwargs):
        psss
        
    # 根据源码分析,上述代码再启动 django 的时候就会立刻执行 as_view 方法
    # url(r"^login", view.view) 和 FBV 一样
    # CBV 和 FBV 再本质上是一样的 都是 路由 对应函数内存地址
"""


文章作者: New Ass
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 New Ass !
  目录