網(wǎng)站首頁 編程語言 正文
theme: channing-cyan
網(wǎng)頁偽靜態(tài)
將動態(tài)網(wǎng)頁偽裝成靜態(tài)網(wǎng)頁,可以提升網(wǎng)頁被搜索引擎檢索道德概率
表現(xiàn)形式為:網(wǎng)址看著像是一個具體的文件路徑例如:http://127.0.0.1:8001/admin/login/
path('index.html', views.index)
視圖層
1.視圖函數(shù)的返回值問題
當(dāng)我們在views.py定義的視圖函數(shù)不設(shè)置返回值時,可以看到django報了以下錯誤:
報錯信息:
The view app01.views.home didn't return an HttpResponse object. It returned None instead.
視圖app01.views.home沒有返回HttpResponse對象。它返回None。
由此我們可以猜測一個結(jié)論:視圖函數(shù)必須返回一個HttpResponse對象 我們ctrl+左鍵進入HttpResponse可以發(fā)現(xiàn)它是一個類:
class HttpResponse(HttpResponseBase):
pass
可是視圖函數(shù)還可以返回render和redirect對象啊,我們進入到這兩個函數(shù)中一探究竟:
def render(...):
pass
return HttpResponse(content, content_type, status)
render函數(shù)返回值也是HttpResponse對象。 再來看看redirect:
def redirect(to, *args, permanent=False, **kwargs):
redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
return redirect_class(resolve_url(to, *args, **kwargs))
redirect函數(shù)返回值也是HttpResponse對象。
由此可見,views.py中的視圖函數(shù)都必須返回一個HttpResponse對象
2.視圖函數(shù)返回json格式數(shù)據(jù)
需求:將字典數(shù)據(jù)序列化成json字符串傳給前端::
方法1:利用json模塊
def home(request):
import json
user_dict = {'name': 'jason老師', 'pwd': 123, 'hobby': ['read', 'run', 'music']}
json_user_dict = json.dumps(user_dict, ensure_ascii=False)
return render(request, 'home.html', json_user_dict)
方法2:利用JsonResponse
from django.http import JsonResponse
def home(request):
JsonResponse(user_dict) #
只用一行代碼就頂替了上述方法三行代碼,非常好用。但有個問題,JsonResponse沒有ensure_ascii參數(shù),也就意味著我們暫時無法阻止?jié)h字編碼。想要解決這個問題,主要我們查看JsonResponse的源碼:
class JsonResponse(HttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
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)
可以看到JsonResponse內(nèi)部是有json.dumps方法的,但這個方法需要傳一些特殊的參數(shù):
**json_dumps_params。這個參數(shù)用來接收多余的關(guān)鍵字參數(shù)并將其打散成一個個的k:v鍵值對。而這些關(guān)鍵字需要我們當(dāng)做json_dumps_params的值,以字典的形式傳入。
于是:
JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False})
這就相當(dāng)于我們設(shè)置了**'ensure_ascii':False** 但是設(shè)置這個參數(shù)的過程屬實有點坎坷~~
除了字典類型,其他容器類型也可以被序列化,不過要指定safe參數(shù)為False
3.form表單攜帶文件數(shù)據(jù)
form表單需要設(shè)置的參數(shù):
<form method="post" enctype="multipart/form-data">
</form>
后端獲取文件代碼:
files = request.FILES # 后端接收文件數(shù)據(jù)只能用FILES方法,不能用POST
4.FBV與CBV
FBV:基于函數(shù)的視圖
# views.py
def home(request):
return render(request, 'home.html')
# urls.py
path('home/', views.home)
CBV:基于類的視圖 CBV會根據(jù)請求方式的不同自動匹配類中定義的方法并自動執(zhí)行
# views.py
from django impost views
class MyView(views.View):
def get(self, request):
return HttpResponse('我是CBV的get方法')
def post(self, request):
return HttpResponse('我是CBV的post方法')
# urls.py
path('func/', views.MyView.as_view())
5.CBV源碼分析
源碼分析入口:
path('func/', views.MyView.as_view())
1.綁定給類的as_view()方法
def as_view(...):
def view(...):
pass
return view
此時路由匹配代碼的本質(zhì):path('func/', views.view())
由此可見,CBV與FBV路由匹配的原理是一樣的
2.path('func/', views.view())?? ?
?? ?這句代碼的意思是:只要我們訪問了func地址,會立即執(zhí)行后面的views.view()
3.進入view()函數(shù):
def view(request, *args, **kwargs):
self = cls(**initkwargs) # 這里的cls使我們自己寫的類MyView self是MyView實例化出來的
對象obj ? 這一句相當(dāng)于 obj = MyView()
? ? ? ? return self.dispatch(request, *args, **kwargs) ?# 這一句相當(dāng)于obj.dispatch()
4.進入dispatch函數(shù)
def dispatch(self, request, *args, **kwargs):
# dispatch是綁定給對象的方法,self相當(dāng)于是我們前文提到的obj
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),self.http_method_not_allowed)
# 反射 通過請求字符串去調(diào)用真正的請求方法 這里的請求是post所以handler是post
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 即post(request, *args, **kwargs)
# 此時 view()函數(shù)的返回值為:
# def view(request, *args, **kwargs):
# return self.post(request, *args, **kwargs)
模板層
1.模板語法傳值
方式1:指名道姓地傳值。好處是不浪費資源,壞處是值過多時不方便
def home(request):
name = 'kevin'
age = 19
return render(request, 'home.html', {'name':name, 'age': age})
方式2:關(guān)鍵字locals()。可以將整個視圖函數(shù)名稱空間中所有的名字全部傳入,簡單快捷,壞處是有冗余
def home(request):
name = 'kevin'
age = 19
return render(request, 'home.html', locals())
2.模板語法傳值的范圍
1.基本數(shù)據(jù)類型都可以傳遞
2.函數(shù)名的傳遞會自動加括號執(zhí)行并將結(jié)果展示到頁面上(注意函數(shù)如果有參數(shù)則不會執(zhí)行也不會展示,模板語法不支持參數(shù))
3.類名的傳遞也會自動加括號調(diào)用并將實例化出的對象展示到頁面上(模板語法會自動判斷每一個名字是否能被加括號調(diào)用,如果可以則自動調(diào)用)
4.對象的傳遞可以直接用句點符點出對象的屬性
5.django的模板語法在操作容器類型時只能用句點符操作(操作列表用 .數(shù)字 的形式)
3.模板語法值過濾器
過濾器類似于python中的內(nèi)置函數(shù)
<p>統(tǒng)計長度:{{ s|length }}</p>
<p>加法運算:{{ s|add:'NB' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>數(shù)據(jù)切片:{{ s|slice:'3' }}</p>
<p>字符截取:{{ s|truncatechars:3 }}</p> # 以字符為單位 多出的部分用...代替
<p>單詞截取:{{ words|truncatewords:3 }}</p> #以單詞為單位 多出的部分用...代替
<p>語法轉(zhuǎn)義:{{ html_tag|safe }}</p> # 識別字符串中的html標(biāo)簽 并渲染(默認(rèn)是不識別)
#html默認(rèn)不識別后端傳過來的字符串標(biāo)簽,指定safe可以讓其識別并渲染
#除了在傳給前端之后讓前端識別 我們也可以在后端處理之后再傳給前端,這樣前端就不用識別了(意味著html頁面上的數(shù)據(jù)不一定非要在html文件中編寫了 也可以通過后端傳入)
from django.utils.safestring import mark_safe
script_tag1 = '<script>alert(666)</script>'
res = mark_safe(script_tag1) # 直接把res傳給前端
'''
django模板語法中的符號就兩個 一個{{}} 一個{%%}
需要使用數(shù)據(jù)的時候 {{}}
需要使用方法的時候 {%%}
'''
4.模板語法標(biāo)簽(類似于python中的流程控制)
if 標(biāo)簽:
{% if 條件 %} ?條件一般是后端傳過來的數(shù)據(jù) ?直接寫名字使用即可
?? ?條件成立執(zhí)行的代碼
{% elif 條件1 %}
?? ?條件1成立執(zhí)行的代碼?? ?
{% else %}
?? ?條件都不成立執(zhí)行的代碼
{% endif %}
for 標(biāo)簽
{% for i in f %}
? ? {% if forloop.first %}
? ? ? ? <p>這是第一次</p>
? ? {% elif forloop.last %}
? ? ? ? <p>這是最后一次</p>
? ? {% else %}
? ? ? ? <p>啥也不是{{ i }}</p>
? ? {% endif %}
?? ?{% empty %}
? ? ?? ?<p>你給我的是個空 怎么for循環(huán)呢</p>
{% endfor %}
for循環(huán)可用的一些參數(shù)
Variable | Description |
---|---|
forloop.counter | 當(dāng)前循環(huán)的索引值(從1開始) |
forloop.counter0 | 當(dāng)前循環(huán)的索引值(從0開始) |
forloop.revcounter | 當(dāng)前循環(huán)的倒序索引值(從1開始) |
forloop.revcounter0 | 當(dāng)前循環(huán)的倒序索引值(從0開始) |
forloop.first | 當(dāng)前循環(huán)是不是第一次循環(huán)(布爾值) |
forloop.last | 當(dāng)前循環(huán)是不是最后一次循環(huán)(布爾值) |
forloop.parentloop | 本層循環(huán)的外層循環(huán) |
5.自定義標(biāo)簽函數(shù)、過濾器、inclusion_tag
如果想實現(xiàn)自定義,必須先做以下幾件事
1.在應(yīng)用下創(chuàng)建一個名為templatetags的文件夾 2.在該文件夾下創(chuàng)建任意名稱的.py文件 3.在該py文件內(nèi)編寫自定義相關(guān)代碼
from django.template import Library
register = Library()
自定義過濾器
@register.filter(name='myfilter')
def my_add(a, b):
return a + b
自定義標(biāo)簽函數(shù)
@register.simple_tag(name='mt')
def func(a, b, c, d):
return a + b + c + d
自定義inclusion_tag
@register.inclusion_tag(filename='it.html')
def index(n):
html = []
for i in range(n):
html.append('第%s頁'%i)
return locals()
自定義標(biāo)簽的使用
{% load mytag %}
{{ i|myfilter:1 }}
{% mt 1 2 3 4 %}
{% index 10 %}
6.模板的繼承
{% extends 'html文件名' %}
{% block 名字 %}
?? ?模板內(nèi)容(將要被繼承的部分)?? ? ? ??? ?
{% endblock %}{% block 名字 %}
?? ?子板內(nèi)容
{% endblock %}
一般情況下母板中至少應(yīng)該有三個區(qū)域使得擴展性更高!!! ??? ?css content js
{% block css %}
{% endblock %}{% block content %}
{% endblock %}{% block js %}
{% endblock %}子板中還可以使用母板的內(nèi)容 ?{{ block.super }}
7.模板的導(dǎo)入
將html頁面的某個部分以模塊的形式導(dǎo)入
{% include 'menu.html' %}
原文鏈接:https://juejin.cn/post/7138751045777227806
相關(guān)推薦
- 2022-03-20 如何在Go中將[]byte轉(zhuǎn)換為io.Reader_Golang
- 2022-10-31 Kotlin定義其他類的實現(xiàn)詳解_Android
- 2022-04-04 快應(yīng)用開發(fā)自定義事件 快應(yīng)用層級 圖片對象Image 獲取元素的寬高
- 2022-06-16 Python數(shù)據(jù)結(jié)構(gòu)之遞歸方法詳解_python
- 2021-11-29 .Net性能測試框架Crank的使用方法_基礎(chǔ)應(yīng)用
- 2022-03-15 org.springframework.web.client.RestTemplate 上傳文件無法
- 2022-04-28 python實現(xiàn)簡單的學(xué)生成績管理系統(tǒng)_python
- 2022-05-28 Entity?Framework?Core表名映射_實用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支