1. 程式人生 > >Django操作資料庫實現註冊&登入驗證

Django操作資料庫實現註冊&登入驗證

前幾天就做完了這個登入&註冊的後臺(我覺得做後臺比做前端省事多了),一直沒空寫……今天抽空給他寫出來做下記錄。

Model 定義

沒啥說的,直接放程式碼

from django.db import models

class UserInfo(models.Model):
    user_id = models.IntegerField(primary_key=True)
    user_name = models.CharField(max_length=30)
    pass_word = models.CharField(max_length=64)
    user_token = models.CharField(max_length=64
) token_last_modified = models.DateTimeField() def __unicode__(self): return self.user_name

前端發來的資料處理

圖省事,前端直接發Json過來。不多說,直接扔程式碼~

#登入
@ensure_csrf_cookie
def login_authentication(request):
    if request.method != "POST":
        return HttpResponse()
    login_state = {}
    try
: user_info = json.loads(bytes.decode(request.body)) db_info = UserInfo.objects.get(user_name=user_info["userName"]) if db_info.pass_word == user_info["userPassWD"]: login_state['authState'] = AuthEnum.LoginSuccess login_state['userID'] = db_info.user_id login_state['userToken'
] = db_info.user_token else: raise ObjectDoesNotExist() except ObjectDoesNotExist: login_state['authState'] = AuthEnum.PasswordNotMatch except KeyError: login_state['authState'] = AuthEnum.BrokenJson finally: http_response = HttpResponse(json.dumps(login_state)) return http_response

django收到的request,body是的格式為bytes。所以需要先decode,然後才能json.load()轉成json。
對於json的訪問跟字典很像,Key-Value。
其次就是Django獲取資料庫的內容了。
UserInfo.objects.get,一個函式,就可以獲得這個物件了。如果沒有找到,會丟擲ObjectDoesNotExist異常。
對於得到的物件的其他值的訪問,通過 obj.name即可訪問。

最後就是字典轉json這個,使用json.dumps即可~

註冊功能的實現

# 直接網上找的隨機字串生成程式碼= =
def get_random_str(random_str_length=64):
    strings = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars) - 1
    random = Random()
    for i in range(random_str_length):
        strings += chars[random.randint(0, length)]
    return strings
# 資料驗證
def valid_register_info(info):
    if info["userName"] == "" or len(info["userPassWD"]) != 64:
        print(info["userName"])
        print(len(info["userPassWD"]))
        raise KeyError
# 註冊
@ensure_csrf_cookie
def register_user(request):
    if request.method != "POST":
        return HttpResponse()
    register_state = {}
    user_info = json.loads(bytes.decode(request.body))
    try:
        valid_register_info(user_info)
        UserInfo.objects.get(user_name=user_info["userName"])
        register_state['authState'] = RegisterEnum.UserNameDuplication
    except ObjectDoesNotExist:
        if UserInfo.objects.last() is None:
            user_id = 1
        else:
            user_id = UserInfo.objects.last().user_id + 1
        UserInfo.objects.create(user_name=user_info["userName"], user_id=user_id,
                                pass_word=user_info["userPassWD"], user_token=get_random_str(64),
                                token_last_modified=timezone.now())
        register_state['authState'] = RegisterEnum.RegisterSuccess
    except KeyError:
        register_state['authState'] = RegisterEnum.BrokenJson
    finally:
        http_response = HttpResponse(json.dumps(register_state))
    return http_response

挑重點的說吧
UserInfo.objects.create,往資料庫新增資料,後面跟著值。
UserInfo.objects.last(),獲取資料庫中最後一條記錄,若資料庫為空,則返回None。
我覺得沒什麼說的了……

附加

python3 manage.py makemigrations
yisilepython3 manage.py migrate

相信各位知道我什麼意思了……