Django模塊導入

Django模塊導入篇

Django基礎

  1. urls.py 導入app中的視圖函數javascript

    from app名字 import views
  2. app.view視圖函數中導入models.py中的類html

    from app名字.models import models中的類
  3. urls.py中的路徑導入(Django自動完成)前端

    from django.conf.urls import url
    # Django2.0替換寫法
    from django.urls import path
  4. app.models.py中建立數據庫要導入的models類(Django自動完成)java

    from django.db import models
  5. 項目測試的腳本文件導入內容python

    import os
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "UserSys.settings")
    
        import django
        django.setup()

Django模板語言

  1. 前端基礎用法ajax

    {{}} 變量相關
    {% %}    邏輯相關
  2. 過濾器數據庫

    基本語法: {{ value|filter_name:arg }}

    自定義filterdjango

    1. 在項目目錄下app目錄中新建一個名字爲templatetags的python package
    2. 在新建的包中新建一個py文件
    3. 在新建的py文件中導入,並編寫自定義filter,自定義filter要使用@register.filter(name=xxx)裝飾
    4. 在前端先加載文件再使用
     加載: {% load py_file %}
     使用: {{ value|filter_name:arg }}
    # py文件中的導入
    from django import template
    register = template.Library()
  3. csrf導入後端

    {% csrf-token %}
  4. 母板瀏覽器

    // 母板中定義頁面專用的CSS塊和JS塊,方便調用
    {% block page_name %}
    {% endblock %}
    
    // 子頁面繼承母板定義的塊
    {% extends '母板html文件' %}
    // 在子頁面中使用
    {% block page_name %}
    {% endblock %}
  5. 組件的導入

    // 將獨立的組件封裝在一個獨立的html文件中,調用直接經過
    {% include 'xxx.html' %}
  6. 靜態文件導入

    // 導入
    {% load static %}
    // 使用
    {% static "images/hi.jpg" as myphoto %}      // 直接當作路徑參數添加
    <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />  // 在外面添加路徑
  7. simple tag導入

    # 後端定義,在自定義過濾器的py文件中定義
    @register.simple_tag(name="xxx")
    def xxx(a, b, c):
        return "{} + {} + {}".format(a, b, c)
    // 前端使用,先導入再使用
    {% load py文件 %}
    
    {# simple tag #}
    {% xxx "1" "2" "abc" %}
  8. inclusion tag導入

    # 後端定義,在自定義的python package中定義
    from django import template
    register = template.Library()
    # 定義tag函數前要加裝飾器
    @register.inclusion_tag('html文件', name='xxx')
    def xxx(args):
     return data
    # 這裏return的data數據是傳至html文件中的,和render相似
    // 前端先導入,再使用
    {% load py文件 %}
    
    {# inclusion tag #}
    {% xxx args %}

Django路由系統

  1. urls.py中包含其餘urlconfs文件

    from django.conf.urls import include, url
    url(r'^blog/', include('blog.urls'))
  2. url命名

    url(r'^home', views.home, name='取名'),  # 給個人url匹配模式起名爲 home
    // 前端引用
    {% url '命名的名字' %}
    # 在視圖函數view.py中的引用
    from django.urls import reverse
    reverse("index")
  3. 命名空間

    # 在urls.py中
    from django.conf.urls import url, include
    urlpatterns = [
        url(r'^app01/', include('app01.urls', namespace='app01')),
        # 經過include找到app01中的urls文件,放在命名空間app01中
        url(r'^app02/', include('app02.urls', namespace='app02')),
    ]
    
    # 在app01的urls.py中
    from django.conf.urls import url
    from app01 import views
    
    app_name = 'app01'
    urlpatterns = [
        url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
    ]
    # 這樣在app01和app02中使用相同名稱的view視圖函數,就不衝突了

    使用規則

    1. 模板中使用

      {% url '命名空間名:name' args %}
    2. 在view視圖函數中使用

      # 先導入再使用
      from django.urls import reverse
      reverse('命名空間:name', args)
# 獲取Cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

# 設置Cookie
rep = HttpResponse(...)
rep = render(request, ...)

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)

# 刪除Cookie
rep = HttpResponse(...)
rep.delete_cookie('key')
return rep

Django Session

# 獲取、設置、刪除Session中數據
request.session['k1']
request.session.get('k1',None)

request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在則不設置

del request.session['k1']

# 將全部Session失效日期小於當前日期的數據刪除
request.session.clear_expired()

# 刪除當前會話的全部Session數據
request.session.delete()

# 刪除當前的會話數據並刪除會話的Cookie。
request.session.flush() 
這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問
例如,django.contrib.auth.logout() 函數中就會調用它。

# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
    * 若是value是個整數,session會在些秒數後失效。
    * 若是value是個datatime或timedelta,session就會在這個時間後失效。
    * 若是value是0,用戶關閉瀏覽器session就會失效。
    * 若是value是None,session會依賴全局session失效策略。
# Session的settings.py的配置
SESSION_COOKIE_AGE = 1209600                # Session的cookie失效日期(2周)(默認)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False     # 是否關閉瀏覽器使得Session過時(默認)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存(默認)
在CBV上加裝飾器引入的模塊
  1. 引入模塊:from django.utils.decorators import method_decorator

  2. 加在CBV視圖的get或post方法上

    from django.utils.decorators import method_decorator
    @method_decorator(裝飾器函數名)
    # 方法函數
  3. 加在dispatch方法上

    from django.utils.decorators import method_decorator
    @method_decorator(裝飾器函數名)
    # dispatch方法
  4. 直接加在視圖類上,但method_decorator必須傳 name 關鍵字參數

    from django.utils.decorators import method_decorator
    
    @method_decorator(裝飾器函數名, name="方法名")
    # 類
設置csrf功能
# 引入模塊
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
'''
csrf_protect,爲當前函數強制設置防跨站請求僞造功能,即使settings中沒有設置全局中間件。
csrf_exempt,取消當前函數防跨站請求僞造功能,即使settings中設置了全局中間件。
'''
# 裝飾器添加方法和上同
@method_decorator(csrf_exempt)
# 方法函數

@method_decorator(csrf_exempt, name='dispatch')
# 類,注意在類上加裝飾器必須加在類中的dispatch方法上

AJAX對應導入模塊

  1. 返回JSON數據的模塊

    from django.http import JsonResponse
  2. 在ajax中傳csrf-token的數據

    // 在$.ajax的data字段中添加csrf信息(前提:在頁面上添加上一個{% csrf-token %})
    data: {
        "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()  // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data中
    }
  3. 利用ajax傳文件

    $("#b3").click(function () {
      var formData = new FormData();     // 利用formdata對象傳文件
      formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());   // 將csrf信息添加到formdata對象中
      formData.append("f1", $("#f1")[0].files[0]);
      $.ajax({
        url: "/upload/",
        type: "POST",
        processData: false,  // 告訴jQuery不要去處理髮送的數據
        contentType: false,  // 告訴jQuery不要去設置Content-Type請求頭
        data: formData,
        success:function (data) {
          console.log(data)
        }
      })
    })

Django中間件

  1. 自定義中間件,導入模塊

    from django.utils.deprecation import MiddlewareMixin
    # 在中間件中可以使用的方法
    # process_request(self,request)
    # process_view(self, request, view_func, view_args, view_kwargs)
    # process_template_response(self,request,response)
    # process_exception(self, request, exception)
    # process_response(self, request, response)

    5z8P4p.png

Django form 表單組件

  1. 導入form模塊

    from django import forms
  2. 定義一個form表單

    class RegFrom(forms.Form):
     pass
  3. 定義一個modelForm表單

    class RegFrom2(forms.ModelForm):
     class Meta:
         model = 'models.表名'
         fields = '__all__'   # 應用全部
         # fields = ["字段1", "字段2"]
         # exclude = ["字段1", "字段2"]  除這裏以外的字段
  4. 實例對象

    form_obj = RegForm()
    form_obj = RegForm(request.POST) # 獲取數據
  5. 前端提交多個form表單

    from django.forms import modelformset_factory, formset_factory
    # 這些路由應該是等待添加到數據庫中權限表裏的數據
        AddFormset = formset_factory(rbac_forms.PermissionForm, extra=0)
        add_formset_obj = AddFormset(request.POST) #獲取數據
       models.Permission.objects.bulk_create(objs) #批量建立
       # 前端必須有
        {{ add_formset_obj.management_form }}
  6. 方法

    form_obj.is_valid()    # 判斷數據是否正確
    form_obj.save()    # 對對象進行添加和修改,若是是對密碼進行操做,且密碼存儲格式是密文,不能直接用這個

Auth認證

  1. 導入auth模塊

    from django.contrib import auth
  2. 導入authenticate(request, **kwargs)方法

    from django.contrib.auth import authenticate
  3. 導入login(request, user)/logout(request)方法

    from django.contrib.auth import login, logout
  4. 導入login_requierd裝飾器

    from django.contrib.auth.decorators import login_required
    # 裝飾器的使用
    @login_required

    更改裝飾器自動跳轉網頁

    # settings.py
    LOGIN_URL = '新的跳轉地址'
  5. 擴展默認的auth表

    # 重構的類必須繼承AbstractUser類
    # models.py
    from django.contrib.auth.models import AbstractUser
    # 重構的類
    
    # settings.py配置
    AUTH_USER_MODEL = "app名.類名"

mark-safe導入

from django.utils.safestring import mark_safe

免除csrf_token驗證的方法

  • 針對於FBV
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt  # 這個函數不走認證
def user(request):
    pass
#走post請求時,就能夠免除驗證了
  • 註釋csrf以後單獨驗證

    from django.views.decorators.csrf import csrf_protect
    @csrf_exempt  # 這個函數須要認證
    def user(request):
      pass
    #註釋掉setting中的csrf,以後須要認證能夠導入

若是是CBV則須要

5Q0112.png

或者

5Q0Aqa.png

相關文章
相關標籤/搜索