1. 程式人生 > 實用技巧 >zookeeper(四)Curator框架 的分散式鎖

zookeeper(四)Curator框架 的分散式鎖

配置 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