首页 > 其他分享 >Django之视图层

Django之视图层

时间:2022-12-13 22:13:06浏览次数:48  
标签:return request 视图 Django json 模板 HttpResponse def

目录

视图层

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} :解决前端汉字转码问题

image

上述前端展示

image

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

相关文章