1. 程式人生 > 實用技巧 >Django學習筆記:第十天 專案AXF-02使用者頁面

Django學習筆記:第十天 專案AXF-02使用者頁面

使用者啟用,認證

-- 途徑

  -- 郵件

  -- 簡訊

  -- 人工稽核

-- 郵件

  -- 傳送郵件

    -- 收件人地址

    -- 發件人的資訊

      -- 使用者名稱

      -- 密碼

      -- 伺服器

        -- 郵件伺服器

        -- 埠

          -- 不加密預設25

          -- 加密465,965

      -- 內容

-- 點選郵件中的連結就可以啟用

  -- 連結中存在使用者的唯一標識

    -- http://xxxxx/activate/?u_token=YYYY

    -- u_token 快取中 作為key, value -> user_id

    -- u_token - > uuid

  -- 標識存在過期時間

  -- 標識存在使用次數限制

url.py

from django.urls import path
from App import views

app_name = 'App'
urlpatterns = [
    path('home/', views.home, name='home'),
    path('market/', views.market, name='market'),
    path('marketwithparams/<int:typeid>/<int:childcid>/<order_rule>/
', views.market_with_params, name='market_with_params'), path('cart/', views.cart, name='cart'), path('mine/', views.mine, name='mine'), path('register/', views.register, name="register"), path('login/', views.login, name="login"), path('checkuser/', views.check_user, name="check_user
"), path('logout/', views.logout, name="logout"), path('activate/', views.activate, name="activate"), ]

views.py

def mine(request):

    user_id = request.session.get('user_id')

    data = {
        "title": "我的",
        "is_login": False
    }

    if user_id:
        user = AXFUser.objects.get(pk=user_id)
        data['is_login'] = True
        data['username'] = user.u_username
        data['icon'] = MEDIA_KEY_PREFIX + user.u_icon.url

    return render(request, 'main/mine.html', context=data)


def register(request):

    if request.method == "GET":

        data = {
            "title": "Register",

        }

        return render(request, 'user/register.html', context=data)

    elif request.method == "POST":

        username = request.POST.get("username")
        email = request.POST.get("email")
        password = request.POST.get("password")
        icon = request.FILES.get("icon")

        # 密碼摘要加密
        # password = hash_str(password)
        # Django內建加密
        password = make_password(password)

        user = AXFUser()
        user.u_username = username
        user.u_password = password
        user.u_email = email
        user.u_icon = icon

        user.save()

        # 使用uuid生成唯一標識字串
        u_token = uuid.uuid4().hex

        # 存入快取中
        cache.set(u_token, user.id, timeout=60*60*24)

        send_email_activate(username, email, u_token)

        return redirect(reverse("axf:login"))


def login(request):

    if request.method == "GET":

        data = {
            "title": "登陸"
        }

        return render(request, 'user/login.html', context=data)

    elif request.method == "POST":

        username = request.POST.get("username")
        password = request.POST.get("password")

        # 校驗密碼
        users = AXFUser.objects.filter(u_username=username)

        if users.exists():
            user = users.first()
            # 使用者密碼,資料安全後的密碼
            if check_password(password, user.u_password):
                # 儲存使用者登入狀態
                request.session['user_id'] = user.id
                return redirect(reverse('axf:mine'))
            else:
                print("密碼錯誤")
                return redirect(reverse('axf:login'))
        print("使用者不存在")
        return redirect(reverse('axf:login'))


def check_user(request):

    username = request.GET.get("username")

    users = AXFUser.objects.filter(u_username=username)

    data = {
        "status": HTTP_OK,
        "msg": 'user can use',
    }

    if users.exists():
        data['status'] = HTTP_USER_EXIST
        data['msg'] = 'user already exist'
    else:
        pass

    return JsonResponse(data=data)


def logout(request):

    request.session.flush()

    return redirect(reverse('axf:mine'))


# 啟用
def activate(request):

    u_token = request.GET.get('u_token')

    user_id = cache.get(u_token)

    if user_id:
        user = AXFUser.objects.get(pk=user_id)

        user.is_active =True

        user.save()
        return redirect(reverse('axf:login'))

    return render(request, 'user/activate_fail.html')

views_helper.py

import hashlib

from django.core.mail import send_mail
from django.template import loader

from GPAXF.settings import EMAIL_HOST_USER, SERVER_HOST, SERVER_PORT

# 密碼摘要加密
def hash_str(source):

    return hashlib.new('sha512', source.encode('utf-8')).hexdigest()

# 啟用-傳送啟用郵件
def send_email_activate(username, receive, u_token):

    subject = '%s AXF Activate' % username

    from_email = EMAIL_HOST_USER

    recipient_list = [receive, ]

    data = {
        'username': username,
        'activate_url': 'http://{}:{}/axf/activate/?u_token={}'.format(SERVER_HOST, SERVER_PORT, u_token)
    }
    # 獲取模板並渲染成頁面
    html_message = loader.get_template('user/activate.html').render(data)

    send_mail(subject=subject, message="", html_message=html_message, from_email=from_email, recipient_list=recipient_list)