欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django視圖層與模板層實(shí)例詳解

 更新時(shí)間:2022年09月03日 17:31:17   作者:愛(ài)新覺(jué)羅吉星  
這篇文章主要為大家介紹了Django視圖層與模板層實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>

theme: channing-cyan

網(wǎng)頁(yè)偽靜態(tài)

將動(dòng)態(tài)網(wǎng)頁(yè)偽裝成靜態(tài)網(wǎng)頁(yè),可以提升網(wǎng)頁(yè)被搜索引擎檢索道德概率

表現(xiàn)形式為:網(wǎng)址看著像是一個(gè)具體的文件路徑例如:http://127.0.0.1:8001/admin/login/

path('index.html', views.index)

視圖層

1.視圖函數(shù)的返回值問(wèn)題

當(dāng)我們?cè)趘iews.py定義的視圖函數(shù)不設(shè)置返回值時(shí),可以看到django報(bào)了以下錯(cuò)誤:

報(bào)錯(cuò)信息:

The view app01.views.home didn't return an HttpResponse object. It returned None instead.

視圖app01.views.home沒(méi)有返回HttpResponse對(duì)象。它返回None。

由此我們可以猜測(cè)一個(gè)結(jié)論:視圖函數(shù)必須返回一個(gè)HttpResponse對(duì)象 我們ctrl+左鍵進(jìn)入HttpResponse可以發(fā)現(xiàn)它是一個(gè)類:

class HttpResponse(HttpResponseBase):
	pass

可是視圖函數(shù)還可以返回render和redirect對(duì)象啊,我們進(jìn)入到這兩個(gè)函數(shù)中一探究竟:

def render(...):
    pass
    return HttpResponse(content, content_type, status)

render函數(shù)返回值也是HttpResponse對(duì)象。 再來(lái)看看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對(duì)象。

由此可見(jiàn),views.py中的視圖函數(shù)都必須返回一個(gè)HttpResponse對(duì)象

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

只用一行代碼就頂替了上述方法三行代碼,非常好用。但有個(gè)問(wèn)題,JsonResponse沒(méi)有ensure_ascii參數(shù),也就意味著我們暫時(shí)無(wú)法阻止?jié)h字編碼。想要解決這個(gè)問(wèn)題,主要我們查看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方法的,但這個(gè)方法需要傳一些特殊的參數(shù):

**json_dumps_params。這個(gè)參數(shù)用來(lái)接收多余的關(guān)鍵字參數(shù)并將其打散成一個(gè)個(gè)的k:v鍵值對(duì)。而這些關(guān)鍵字需要我們當(dāng)做json_dumps_params的值,以字典的形式傳入。

于是:

JsonResponse(user_dict, json_dumps_params={'ensure_ascii':False})

這就相當(dāng)于我們?cè)O(shè)置了**'ensure_ascii':False** 但是設(shè)置這個(gè)參數(shù)的過(guò)程屬實(shí)有點(diǎn)坎坷~~

除了字典類型,其他容器類型也可以被序列化,不過(guò)要指定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會(huì)根據(jù)請(qǐng)求方式的不同自動(dòng)匹配類中定義的方法并自動(dòng)執(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

此時(shí)路由匹配代碼的本質(zhì):path('func/', views.view())

由此可見(jiàn),CBV與FBV路由匹配的原理是一樣的

2.path('func/', views.view())    

    這句代碼的意思是:只要我們?cè)L問(wèn)了func地址,會(huì)立即執(zhí)行后面的views.view()

3.進(jìn)入view()函數(shù):

    def view(request, *args, **kwargs):
        self = cls(**initkwargs)    # 這里的cls使我們自己寫(xiě)的類MyView  self是MyView實(shí)例化出來(lái)的

對(duì)象obj   這一句相當(dāng)于 obj = MyView()

        return self.dispatch(request, *args, **kwargs)  # 這一句相當(dāng)于obj.dispatch()

4.進(jìn)入dispatch函數(shù)

    def dispatch(self, request, *args, **kwargs):  
    # dispatch是綁定給對(duì)象的方法,self相當(dāng)于是我們前文提到的obj
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(),self.http_method_not_allowed)
           # 反射  通過(guò)請(qǐng)求字符串去調(diào)用真正的請(qǐng)求方法   這里的請(qǐng)求是post所以handler是post
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 即post(request, *args, **kwargs)
        # 此時(shí) view()函數(shù)的返回值為: 
         #  def view(request, *args, **kwargs):
         #        return self.post(request, *args, **kwargs)

模板層

1.模板語(yǔ)法傳值

方式1:指名道姓地傳值。好處是不浪費(fèi)資源,壞處是值過(guò)多時(shí)不方便

def home(request):
    name = 'kevin'
    age = 19
    return render(request, 'home.html', {'name':name, 'age': age})

方式2:關(guān)鍵字locals()。可以將整個(gè)視圖函數(shù)名稱空間中所有的名字全部傳入,簡(jiǎn)單快捷,壞處是有冗余

def home(request):
    name = 'kevin'
    age = 19
    return render(request, 'home.html', locals())

2.模板語(yǔ)法傳值的范圍

1.基本數(shù)據(jù)類型都可以傳遞

2.函數(shù)名的傳遞會(huì)自動(dòng)加括號(hào)執(zhí)行并將結(jié)果展示到頁(yè)面上(注意函數(shù)如果有參數(shù)則不會(huì)執(zhí)行也不會(huì)展示,模板語(yǔ)法不支持參數(shù))

3.類名的傳遞也會(huì)自動(dòng)加括號(hào)調(diào)用并將實(shí)例化出的對(duì)象展示到頁(yè)面上(模板語(yǔ)法會(huì)自動(dòng)判斷每一個(gè)名字是否能被加括號(hào)調(diào)用,如果可以則自動(dòng)調(diào)用)

4.對(duì)象的傳遞可以直接用句點(diǎn)符點(diǎn)出對(duì)象的屬性

5.django的模板語(yǔ)法在操作容器類型時(shí)只能用句點(diǎn)符操作(操作列表用 .數(shù)字 的形式)

3.模板語(yǔ)法值過(guò)濾器

過(guò)濾器類似于python中的內(nèi)置函數(shù)

    <p>統(tǒng)計(jì)長(zhǎng)度:{{ s|length }}</p>
    <p>加法運(yùn)算:{{ 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>語(yǔ)法轉(zhuǎn)義:{{ html_tag|safe }}</p>		# 識(shí)別字符串中的html標(biāo)簽 并渲染(默認(rèn)是不識(shí)別)
#html默認(rèn)不識(shí)別后端傳過(guò)來(lái)的字符串標(biāo)簽,指定safe可以讓其識(shí)別并渲染
#除了在傳給前端之后讓前端識(shí)別 我們也可以在后端處理之后再傳給前端,這樣前端就不用識(shí)別了(意味著html頁(yè)面上的數(shù)據(jù)不一定非要在html文件中編寫(xiě)了 也可以通過(guò)后端傳入)
    from django.utils.safestring import mark_safe
        script_tag1 = '<script>alert(666)</script>'
        res = mark_safe(script_tag1)  # 直接把res傳給前端

'''
django模板語(yǔ)法中的符號(hào)就兩個(gè) 一個(gè){{}} 一個(gè){%%}
	需要使用數(shù)據(jù)的時(shí)候 {{}}
	需要使用方法的時(shí)候 {%%}
'''  

4.模板語(yǔ)法標(biāo)簽(類似于python中的流程控制)

if 標(biāo)簽:

{% if 條件 %}  條件一般是后端傳過(guò)來(lái)的數(shù)據(jù)  直接寫(xiě)名字使用即可
    條件成立執(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>你給我的是個(gè)空 怎么for循環(huán)呢</p>
{% endfor %}

for循環(huán)可用的一些參數(shù)

VariableDescription
forloop.counter當(dāng)前循環(huán)的索引值(從1開(kāi)始)
forloop.counter0當(dāng)前循環(huán)的索引值(從0開(kāi)始)
forloop.revcounter當(dāng)前循環(huán)的倒序索引值(從1開(kāi)始)
forloop.revcounter0當(dāng)前循環(huán)的倒序索引值(從0開(kāi)始)
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ù)、過(guò)濾器、inclusion_tag

如果想實(shí)現(xiàn)自定義,必須先做以下幾件事

1.在應(yīng)用下創(chuàng)建一個(gè)名為templatetags的文件夾 2.在該文件夾下創(chuàng)建任意名稱的.py文件 3.在該py文件內(nèi)編寫(xiě)自定義相關(guān)代碼

from django.template import Library
	register = Library()

自定義過(guò)濾器

@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頁(yè)'%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)該有三個(gè)區(qū)域使得擴(kuò)展性更高!!!      css content js
{% block css %}
{% endblock %}

{% block content %}
{% endblock %}

{% block js %}
{% endblock %}

子板中還可以使用母板的內(nèi)容  {{ block.super }}

7.模板的導(dǎo)入

將html頁(yè)面的某個(gè)部分以模塊的形式導(dǎo)入

{% include 'menu.html' %}

以上就是Django視圖層與模板層實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Django視圖層模板層的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python多線程編程(五):死鎖的形成

    Python多線程編程(五):死鎖的形成

    這篇文章主要介紹了Python多線程編程(五):死鎖的形成,本文講解了死鎖的概念、死鎖示例、避免死鎖的方法等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • 將python打包后的exe還原成py

    將python打包后的exe還原成py

    這篇文章主要介紹了將python打包后的exe還原成py,利用pyinstxtractor.py?拆包(解壓)工具,將exe文件解壓成一個(gè)文件夾<BR>uncompyle6?pyc反編譯工具,需要的朋友可以參考一下
    2022-01-01
  • 基于PyQt5完成的PDF拆分功能

    基于PyQt5完成的PDF拆分功能

    這篇文章主要介紹了基于PyQt5完成的PDF拆分功能,本文介紹的pdf拆分功能還有一些待完善地方,例如可增加預(yù)覽功能,實(shí)現(xiàn)每頁(yè)預(yù)覽,以及如何實(shí)現(xiàn)多條件拆分,需要的朋友可以參考下
    2022-06-06
  • 解決pycharm安裝第三方庫(kù)失敗的問(wèn)題

    解決pycharm安裝第三方庫(kù)失敗的問(wèn)題

    這篇文章主要介紹了pycharm安裝第三方庫(kù)失敗的解決方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • jupyter?notebook加載和運(yùn)行.py文件方式

    jupyter?notebook加載和運(yùn)行.py文件方式

    這篇文章主要介紹了jupyter?notebook加載和運(yùn)行.py文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Python之列表的append()方法最容易踩的坑

    Python之列表的append()方法最容易踩的坑

    這篇文章主要介紹了Python之列表的append()方法最容易踩的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python爬蟲(chóng)如何破解JS加密的Cookie

    Python爬蟲(chóng)如何破解JS加密的Cookie

    這篇文章主要介紹了Python爬蟲(chóng)如何破解JS加密的Cookie,幫助大家更好的理解和使用爬蟲(chóng),感興趣的朋友可以了解下
    2020-11-11
  • Python爬蟲(chóng)實(shí)戰(zhàn)之網(wǎng)易云音樂(lè)加密解析附源碼

    Python爬蟲(chóng)實(shí)戰(zhàn)之網(wǎng)易云音樂(lè)加密解析附源碼

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你解析網(wǎng)易云音樂(lè)數(shù)據(jù),大家可以在實(shí)戰(zhàn)過(guò)程中更有效的掌握python
    2021-10-10
  • Django models filter篩選條件詳解

    Django models filter篩選條件詳解

    這篇文章主要介紹了Django models filter篩選條件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能)

    Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能)

    這篇文章主要介紹了Django中使用pillow實(shí)現(xiàn)登錄驗(yàn)證碼功能(帶刷新驗(yàn)證碼功能),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論