中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django如何使用jinja2模板

發布時間:2023-02-23 11:30:56 來源:億速云 閱讀:138 作者:iii 欄目:開發技術

這篇“Django如何使用jinja2模板”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Django如何使用jinja2模板”文章吧。

    jinja2介紹

    Jinja2:是 Python 下一個被廣泛應用的模板引擎,是由Python實現的模板語言,他的設計思想來源于 Django 的模板引擎,并擴展了其語法和一系列強大的功能,尤其是Flask框架內置的模板語言

    由于django默認模板引擎功能不齊全,速度慢,所以我們也可以在Django中使用jinja2, jinja2宣稱比django默認模板引擎快10-20倍。

    Django主流的第三方APP基本上也都同時支持Django默認模板及jinja2,所以要用jinja2也不會有多少障礙。

    安裝jinja2模塊

    pip install jinja2

    Django配置jinja2

    1.在項目文件中創建 jinja2_env.py 文件

    from jinja2 import Environment
     
    def environment(**options):
        env = Environment(**options)
     
        return env

    2.在settings.py文件

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.jinja2.Jinja2',#修改1
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS':True,
            'OPTIONS':{
                'environment': 'jinja2_env.environment',# 修改2
                'context_processors':[
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]

    jinja2模板的使用絕大多數和Django自帶模板一樣

    Django如何使用jinja2模板

    jinja2自定義過濾器

    Django文檔

    在jinja2_env.py文件中自定義過濾器

    from jinja2 import Environment
     
    def environment(**options):
        env = Environment(**options)
     
        # 2.將自定義的過濾器添加到 環境中
        env.filters['do_listreverse'] = do_listreverse
     
        return env
     
    # 1.自定義過濾器
    def do_listreverse(li):
        if li == "B":
            return "哈哈"

    CSRF

    CSRF全拼為Cross Site Request Forgery,譯為跨站請求偽造。

    CSRF指攻擊者盜用了你的身份,以你的名義發送惡意請求。

    • 包括:以你名義發送郵件,發消息,盜取你的賬號,甚至于購買商品,虛擬貨幣轉賬......

    造成的問題:個人隱私泄露以及財產安全。

    CSRF攻擊示意圖

    客戶端訪問服務器時沒有同服務器做安全驗證

    Django如何使用jinja2模板

    防止 CSRF 攻擊

    步驟

    • 在客戶端向后端請求界面數據的時候,后端會往響應中的 cookie 中設置 csrf_token 的值

    • 在 Form 表單中添加一個隱藏的的字段,值也是 csrf_token

    • 在用戶點擊提交的時候,會帶上這兩個值向后臺發起請求

    • 后端接受到請求,以會以下幾件事件:

      • 從 cookie中取出 csrf_token

      • 從 表單數據中取出來隱藏的 csrf_token 的值

      • 進行對比

    • 如果比較之后兩值一樣,那么代表是正常的請求,如果沒取到或者比較不一樣,代表不是正常的請求,不執行下一步操作

    代碼演示

    未進行 csrf 校驗的 WebA

    后端代碼實現

    #定義路由
    from django.conf.urls  import url
    from pay import views
    urlpatterns = [
        url(r'^$',views.LoginView.as_view(),name='index'),   #登錄路由 
        url(r'^transfer/$',views.TransferView.as_view(),name='transfer'), #轉賬路由
    ]
     
    #定義視圖
    class LoginView(View):
     
        def post(self,request):
     
            # 取到表單中提交上來的參數
            username = request.POST.get("username")
            password = request.POST.get("password")
     
            if not all([username, password]):
                print('參數錯誤')
            else:
                print(username, password)
                if username == 'laowang' and password == '1234':
                    # 狀態保持,設置用戶名到cookie中表示登錄成功
                    response = redirect(reverse('transfer'))
                    response.set_cookie('username', username)
                    return response
                else:
                    print('密碼錯誤')
            return render(request,'login.html')
        def get(self,request):
            return render(request,'login.html')
     
    class TransferView(View):
     
     
        def post(self,request):
            # 從cookie中取到用戶名
            username = request.COOKIES.get('username', None)
            # 如果沒有取到,代表沒有登錄
            if not username:
                return redirect(reverse('index'))
     
     
            to_account = request.POST.get("to_account")
            money = request.POST.get("money")
     
            print('假裝執行轉操作,將當前登錄用戶的錢轉賬到指定賬戶')
            return HttpResponse('轉賬 %s 元到 %s 成功' % (money, to_account))
     
        def get(self, request):
            # 渲染轉換頁面
            response = render(request, 'transfer.html')
     
            return response

    前端登錄頁面代碼

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登錄</title>
    </head>
    <body>
     
    <h2>我是網站A,登錄頁面</h2>
     
    <form method="post">
        <label>用戶名:</label><input type="text" name="username" placeholder="請輸入用戶名"><br/>
        <label>密碼:</label><input type="password" name="password" placeholder="請輸入密碼"><br/>
        <input type="submit" value="登錄">
    </form>
     
    </body>
    </html>

    前端轉賬頁面代碼

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>轉賬</title>
    </head>
    <body>
    <h2>我是網站A,轉賬頁面</h2>
     
    <form method="post">
        <label>賬戶:</label><input type="text" name="to_account" placeholder="請輸入要轉賬的賬戶"><br/>
        <label>金額:</label><input type="number" name="money" placeholder="請輸入轉賬金額"><br/>
        <input type="submit" value="轉賬">
    </form>
     
    </body>
    </html>

    運行測試,如果在未登錄的情況下,不能直接進入轉賬頁面,測試轉賬是成功的

    攻擊網站B的代碼

    后端代碼實現

    #定義路由
    from django.conf.urls import url
    from ads import views
     
    urlpatterns = [
        url(r'^$',views.AdsView.as_view()),
    ]
     
    #定義視圖
    class AdsView(View):
     
        def get(self,request):
     
            return render(request,'index.html')

    前端代碼實現

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
     
    <h2>我是網站B</h2>
     
    <form method="post" action="http://127.0.0.1:9000/transfer/">
        <input type="hidden" name="to_account" value="黑客">
        <input type="hidden" name="money" value="190000" hidden>
        <input type="submit" value="點擊領取優惠券">
    </form>
     
    </body>
    </html>

    運行測試,在用戶登錄網站A的情況下,點擊網站B的按鈕,可以實現偽造訪問

    在網站A中實現 csrf_token 校驗的流程 導入生成 csrf_token 的函數

     from django.middleware.csrf import get_token
     csrf_token = get_token(request)

    在渲染轉賬頁面的,做以下幾件事情:

    • 生成 csrf_token 的值

    • 在返回轉賬頁面的響應里面設置 csrf_token 到 cookie 中

    • 將 csrf_token 保存到表單的隱藏字段中

     def get(self, request):
            # 生成csrf_token
            from django.middleware.csrf import get_token
            csrf_token = get_token(request)
     
            # 渲染轉換頁面,傳入 csrf_token 到模板中
            response = render(request, 'transfer.html',context={'csrf_token':csrf_token})
     
            # 設置csrf_token到cookie中,用于提交校驗
            response.set_cookie('csrf_token', csrf_token)
     
            return response

    在轉賬模板表單中添加 csrf_token 隱藏字段

    <head>
        <meta charset="UTF-8">
        <title>轉賬</title>
    </head>
    <body>
    <h2>我是網站A,轉賬頁面</h2>
     
    <form method="post">
        <input type="hidden" name="csrftoken" value="{{ csrf_token }}">
        <label>賬戶:</label><input type="text" name="to_account" placeholder="請輸入對方賬戶"><br/>
        <label>金額:</label><input type="number" name="money" placeholder="請輸入轉賬金額"><br/>
        <input type="submit" value="轉賬">
    </form>
     
    </body>
    </html>

    運行測試,進入到轉賬頁面之后,查看 cookie 和 html 源代碼

    Django如何使用jinja2模板

    在執行轉賬邏輯之前進行 csrf_token 的校驗

     # 取出表單中的 csrf_token
     form_csrf_token = request.POST.get("csrftoken")
     # 取出 cookie 中的 csrf_token
     cookie_csrf_token = request.COOKIES.get('csrf_token')
     # 進行對比
     if cookie_csrf_token != form_csrf_token:
         return HttpResponse('token校驗失敗,可能是非法操作')

    運行測試,用戶直接在網站 A 操作沒有問題,再去網站B進行操作,發現轉賬不成功,因為網站 B 獲取不到表單中的 csrf_token 的隱藏字段,而且瀏覽器有同源策略,網站B是獲取不到網站A的 cookie 的,所以就解決了跨站請求偽造的問題

    在 Django項目中解決 CSRF 攻擊

    Django默認是開啟CSRF的

    Django如何使用jinja2模板

    模板中設置 CSRF 令牌

    {% csrf_token %}
    或者
    <input type="hidden" value="{{ csrf_token }}">

    以上就是關于“Django如何使用jinja2模板”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    内江市| 彭泽县| 九江县| 肥东县| 三门峡市| 资中县| 西昌市| 宜兰市| 台北县| 纳雍县| 桐庐县| 克东县| 鄯善县| 饶平县| 通榆县| 金湖县| 镇康县| 南乐县| 弥渡县| 湖南省| 玉门市| 汾西县| 崇仁县| 江津市| 台湾省| 综艺| 赤峰市| 多伦县| 轮台县| 兴隆县| 西乌| 迭部县| 浪卡子县| 普兰店市| 资讯| 收藏| 保德县| 司法| 惠州市| 永春县| 桃园县|