首页 > 其他分享 >视图层与模板层

视图层与模板层

时间:2022-09-02 22:46:18浏览次数:48  
标签:return request 视图 html 模板 HttpResponse def

网页伪静态

伪静态页面其实是动态页面,只是看起来和静态页面一样,将动态网页伪装成静态网页,可以提升网页被搜索引擎收录的概率,表现上网址看的像一个具体的文件路径
def test(request):
    from django.shortcuts import HttpResponse
    return HttpResponse('伪静态')

urlpatterns = [
    path('test.html', test),
]

网址:
http://127.0.0.1:8000/test.html

视图层

1.视图层函数必须返回一个HttpResponse对象
1.1return HttpResponse()
'HttpResponse是一个类,类加括号就是产生这个类的对象'
class HttpResponse(HttpResponseBase):
    pass

1.2return render()
def render(request, template_name, context=None, content_type=None, status=None, using=None):
    content = loader.render_to_string(template_name, context, request, using=using)
    return HttpResponse(content, content_type, status)
'render加括号会返回HttpResponse加括号'

1.3return redirect()
def redirect(to, *args, permanent=False, **kwargs):
    redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
    return redirect_class(resolve_url(to, *args, **kwargs))
'redirect加括号内有一个三元函数,它的两个结果都会继承一个HttpResponseRedirectBase的父类'
class HttpResponseRedirectBase(HttpResponse):
    allowed_schemes = ['http', 'https', 'ftp']
'而HttpResponseRedirectBase又会继承一个HttpResponse的父类'

2.视图函数返回json格式数据
1.1json的方法
def test(request):
    dict = {'name': 'barry', 'age': 18, 'true_name': '巴里'}
    json_str = json.dumps(dict, ensure_ascii=False)  # 不把中文编码
    return HttpResponse(json_str)
1.2django的方法
from django.http import JsonResponse
def test(request):
    dict = {'name': 'barry', 'age': 18, 'true_name': '巴里'}
    return JsonResponse(dict, json_dumps_params={'ensure_ascii': False})
"给JsonResponse底层的json_dumps_params传了{'ensure_ascii': False}字典,**在实参中会将字典打散成关键字参数>>>ensure_ascii=False"
class JsonResponse(HttpResponse):
    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        if safe and not isinstance(data, dict):
            raise TypeError(
                'In order to allow non-dict objects to be serialized set the '
                'safe parameter to False.'
            )
        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)

3.form表单携带文件数据,需要具备几个条件
3.1html文件的method属性值必须是post,enctype属性值必须是multipart/form-data
<form action="" method="post" enctype="multipart/form-data">
3.2后端获取文件数据的操作
def func(request):
    if request.method == 'POST':
        print(request.POST)
        # <QueryDict: {'username': ['barry']}>
        print(request.FILES)
        # <MultiValueDict: {'file': [<InMemoryUploadedFile: image-20220808163623745.png (image/png)>]}>
    return render(request, 'func.html')

4.FBV:基于函数的视图
后端:def index(request):
    return HttpResponse()
路由:path('index/', views.index)

5.CBV:基于类的视图
路由:path('func/', views.MyView.as_view())
后端:from django import views
class MyView(views.View):
    def get(self, request):
        return HttpResponse('get')

    def post(self, request):
        return HttpResponse('post')
'CBV会自动根据请求方式的不同匹配类中定义的方法并自动执行'

6.CBV源码分析
6.1path('func/', views.MyView.as_view())
    @classonlymethod
    def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            # cls是我们直接定义的类,self = MyView()
            return self.dispatch(request, *args, **kwargs)
        return view
'''
as_view内部会返回一个view,所以路由匹配本质上是:
path('func/', views.MyView.view)
'''

6.2path('func/', views.MyView.view)
所以我们访问func时会触发view执行
return self.dispatch(request, *args, **kwargs)
'view会返回一个dispatch'

6.3dispatch方法
def dispatch(self, request, *args, **kwargs):
    # 获取请求方式转换为小写,在判断请求方式在不在http_method_names方法里
    if request.method.lower() in self.http_method_names:  # 假设是get
        # get函数名 = getattr(对象, 'get')
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)
'最后执行handler,handler是get函数名则会执行get函数'
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
img

模板层

1.模板语法传值
1.1方式1:指名道姓传参,不浪费资源
def func(request):
    name = 'barry'
    return render(request, 'func.html', {'name':name})
1.2方式2:locals()
将整个局部名称空间中的名字全部传入简单快捷
def func(request):
    s = 'aaa'
    return render(request, 'func.html', locals())
html获取名字方法:<p>{{ s }}</p>

2.模板语法传值范围
2.1基本数据类型可以直接传递使用
s = 'aaa'
i = 11
f = 22.2
l = [1, 2, 3]
d = {'name': 'barry', 'pwd': 666}
t = (1, 2, 3)
se = {1, 2, 3}
b = True
'django的模板语法在操作容器类型的时候只能使用句点符'
2.2函数名的传递会自动加括号执行并将返回值展示到页面上,如果函数有参则不会执行也不会展示,模板语法不支持有参函数
def func1():
    return 'func1'
<p>{{ func1 }}</p>
2.3类名的传递也会自动加括号产生对象并将返回值展示到页面上,对象的传递则直接使用
'模板语法会判断名字是否可以调用,如果可以调用则调用'

3.模板语法过滤器(类似于python内置函数)
3.1后端
s = 'aaa'
i = 11
from datetime import datetime
res = datetime.today()
file = 45354
l = [1, 2, 3]
s1 = 'Batman is watching you'
tag = "<h1>'蝙蝠侠在看着你'<h1>"
return render(request, 'func.html', locals())
3.2html
<p>统计长度:{{ s|length }}</p>
# 统计长度:3
<p>加法运算:{{ i|add:2 }}、加法运算:{{ s|add:'abc' }}</p>
# 加法运算:13、加法运算:aaaabc
<p>日期格式:{{ res|date:'Y-m-d H:i:s' }}</p>
# 日期格式:2022-09-02 21:47:45
<p>文件大小:{{ file|filesizeformat }}</p>
# 文件大小:44.3 KB
<p>数据切片:{{ l|slice:'0.1' }}</p>
# 数据切片:[1, 2, 3]
<p>字符截取(三个点算一个):{{ s1|truncatechars:3 }}</p>
# 字符截取(三个点算一个):Ba…
<p>单词截取(空格):{{ s1|truncatewords:3 }}</p>
# 单词截取(空格):Batman is watching …
<p>语法转义:{{ tag|safe }}</p>  # 默认是不转的,必须加转义方法
# 语法转义:'蝙蝠侠在看着你'
3.3有时候html页面上的数据不一定非要在html页面上编写了,也可以后端写好传入
'''
django模板语法中的符号就只有连个:
需要使用数据时: {{}}
需要使用方法时: {%%}
'''

4.模板语法标签(类似python的流程控制)
{% if 条件1 %}
    条件1成立的代码
{% elif 条件2 %}
    条件2成立执行的代码
{% else %}
    条件都不成立时执行的代码
{% endif %}
'条件一般是模板语法传过来的数据'

{% for i in l %}
    {% if forloop.first %}  # 第一次循环时first为True
        <p>第一次循环</p>
    {% elif forloop.last %}  # 最后一次循环last为True
        <p>最后一次循环</p>
        {% else %}
        <p>{{ i }}</p>
    {% endif %}
{% endfor %}

5.自定义标签函数、过滤器、inclusion_tag
'''
想要自定义,需要先做以下三件事
1.在应用下创建一个templatetags文件夹
2.在该文件夹内创建任意名称的py文件
3.在该py文件内编写自定义相关代码
from django.template import Library
register = Library()
'''
5.1自定义过滤器
@register.filter(name='myfilter')
def my_add(a, b):
    return a + b

5.2自定义标签函数
@register.simple_tag(name='mt')
def func(a, b, c, d):
    return a + b + c + d

5.3自定义inclusion_tag
@register.inclusion_tag(filename='it.html')
def index(n):
    html = []
    for i in range(n):
        html.append('第%s页'%i)
        return locals()

5.4html
{% load mytag %}
{{ i|myfilter:1 }}
{% mt 1 2 3 4 %}
{% index 10 %}

6.模板的继承
6.1模板
{% block 名字 %}
模板内容
{% endblock %}
6.2子板
{% extends 'html文件名' %}
{% block 名字 %}
子板内容
{% endblock %}
'一般情况下母板中至少应该有三个区域使得扩展性更高'

7.模板的导入
将html页面的某个部分当做模块的形式导入使用
{% include 'menu.html' %}

标签:return,request,视图,html,模板,HttpResponse,def
From: https://www.cnblogs.com/riuqi/p/16651572.html

相关文章

  • 【Django】 第04回 视图层与模板层
    目录1.网页伪静态2.视图层2.1视图函数的返回值问题2.2视图函数返回json格式数据2.3from表单携带文件数据2.4FEV与CBV2.5CBV源码分析3.模板层3.1模板语法传值3.2......
  • 【luogu P5056】【模板】插头dp(插头DP)(分类讨论)
    【模板】插头dp题目链接:luoguP5056题目大意有一个n*m的网格,每个格子要么必须铺线,要么必须不铺。然后问你有多少个铺发使得形成一个闭合回路。思路快乐插头DP模......
  • django之视图层与模板层
    一、伪静态网页'''其实就是如果一个网页如果是一个静态网页的话那么浏览器搜索会更容易搜索的到而如果一个动态网页想要让浏览器更容易搜索到的话可以在路由匹配的时......
  • 43. SQL--视图:create view
    1.前言视图(view)是一个由select查询所定义出来的虚拟表。我们知道,select查询会产生一个包含行和列的结果集,它在结构上和真实的物理表是类似的,您可以把这个结果集看做......
  • 查看Oracle当前用户下的(表,视图,同义词,索引等...)
     copy自:查看Oracle当前用户下的(表,视图,同义词,索引等...)表空间–查看当前用户表空间selectusername,default_tablespacefromuser_users;selectdefault_tablespace......
  • 【BFS】算法模板与思路
    1.BFS算法的基础理论是什么?BFS算法名叫宽度优先搜索,虽然我能理解深度优先搜索,但我却不是很能理解宽度优先搜索。一个很关键的点在于:宽度优先搜索是一个迭代的算法,不是递......
  • ECCV 2022 | MVDG:一种用于域泛化的统一多视图框架
    前言 论文提出了一种新的多视图分布式目标框架,以有效地减少训练和测试阶段的过拟合。具体来说就是,在训练阶段,开发了一种多视图正则化元学习算法,利用多个优化轨迹产生适合......
  • 【django学习-07】视图之HttpResponse
    前言:视图函数通过return方式返回响应数据,然后生成响应的网页内容呈现在浏览器上。视图函数主要有两种返回数据的方法HttpResponse:直接返回数据到浏览器上,不能使用模......
  • 1.Mybatis-XML模板
    SELECT sr.ROLE_IDASroleId, sr.ROLE_NAMEASroleName, sr.IS_ACTIVEASisActive, sr.REMARKASremark, sr.CREATE_DATETIMEAScreateDatetime, CON......
  • SpringMVC视图
    SpringMVC中的视图SpringMVC中的视图是view接口,视图的作用是用来渲染数据,将模型model中的数据展示给用户,SpringMVC视图的种类很多,默认有转发视图:InternalResourceView和重......