配置 jinja2
修改模板名
TEMPLATES:
'BACKEND': 'django.template.backends.jinja2.Jinja2'
注釋掉admin (jinja2沒有admin)
# 'django.contrib.admin',
# path('admin/', admin.site.urls),
創建Jinja2環境配置函式
from jinja2 import Environment
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
def jinja2_environment(**options):
"""創建 jinja2 環境物件"""
env = Environment(**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
return env
匯入jinja2的配置
TEMPLATES
'environment': 'woniumall.utils.jinja2_env.jinja2_environment'
配置session,cookie的有效期
# 沒有記住用戶:瀏覽器會話結束就過期
request.session.set_expiry(0)
# 記住用戶:None表示兩周后過期
request.session.set_expiry(None)
# 設定cookie 為關閉瀏覽器則有效期結束
response.set_cookie('username', user.username)
# 登錄時用戶名寫入到cookie,有效期14天
response.set_cookie('username', user.username, max_age=3600 * 24 * 14)
配置reverse
全域的urls
re_path(r'^', include(('areas.urls', 'areas')))
區域的urls
re_path(r'^addresses/$', views.AddressView.as_view(), name='address'),
re_path(r'^aaa',views.Aa.as_view())
view
class AddressView(LoginRequiredMixin, View):
def get(self, request):
return render(request, 'user_center_site.html')
class Aa(View):
def get(self, request):
# return redirect('/addresses/')
return redirect(reverse('areas:address'))
authenticate 多用戶登錄(用戶名,手機號)
配置認證后端
# settings/dev.py
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend', 'users.auth_backend.MobilePasswordBackend']
創建自定義認證后端
# auth_backend.py
class MobilePasswordBackend(BaseBackend):
def authenticate(self, request, **kwargs):
mobile = kwargs.get('username')
password = kwargs.get('password')
if not re.match(r'^1[3-9]\d{9}$', mobile):
return
try:
# 通過手機號查詢資料庫
user = UserModel.objects.get(mobile=mobile)
except UserModel.DoesNotExist:
return
if user.check_password(password):
return user
def get_user(self, user_id):
try:
user = UserModel.objects.get(pk=user_id)
except UserModel.DoesNotExist:
return None
return user
運行流程
1 加載 dev.py
2 觸發 users.views.LoginView
user = authenticate(username=username, password=password)
3 回圈 _get_backends(return_tuples=True) # 到AUTHENTICATION_BACKENDS里面去回圈,默認有一個(ModelBackend)
4 先到 django.contrib.auth.backends.ModelBackend里, 用username到資料庫里找
5 沒有找到, 回傳回圈 _get_backends(return_tuples=True)
6 再到 users.auth_backend.MobilePasswordBackend里, 用mobile在資料里找
實作狀態保持(login)
在認證用戶(authenticate)時,會自動配置認證后端(backend),再實作狀態保持(login)時,認證后端(backend)會自動系結再用戶身上;
如果沒有進行認證用戶(authenticate)時,用戶身上則沒有認證后端(backend),則要實作狀態保持(login)時,就要手動系結認證后端(backend)
跨域問題(二選一)
1. 再回傳時設定response的請求頭
response = render(request, 'register.html')
response["Access-Control-Allow-Origin"] = '*'
return response
2. 可以再組態檔配置跨域
a) pip install django-core-header
b) INSTALLED_APPS 里面添加 corsheaders
c) MIDDLEWARE 里面添加 corsheaders.middleware.CorsMiddleware,django.middleware.common.CommonMiddleware
d) CORS_ORIGIN_ALLOW_ALL = True, CORS_ALLOW_CREDENTIALS = True
e) 配置允許訪問的連接 CORS_ORIGIN_WHITELIST = ('http://127.0.0.1:8080', 'http://localhost:8080', 'http://www.meiduo.site:8080',)
f) 配置訪問方式 CORS_ALLOW_METHODS = ('DELETE','GET','OPTIONS','PATCH','POST','PUT','VIEW',)
g) 配置允許訪問的請求頭
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)
cookie無妨傳遞
// 是否允許攜帶cookie
axios.withCredentials = true;
axios.defaults.withCredentials = true
// 若127.0.0.1:8000可以而www.meiduo.site:8000不可以
則是因為前端的host被設定為 127.0.0.1:8000,修改前端的host
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88999.html
標籤:Python
上一篇:Yii偽靜態設定
