网页伪静态
伪静态页面其实是动态页面,只是看起来和静态页面一样,将动态网页伪装成静态网页,可以提升网页被搜索引擎收录的概率,表现上网址看的像一个具体的文件路径
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']
模板层
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