Flask 愛家租房專案ihome 03 登入

2022-07-22 20:42:17 字數 4231 閱讀 3994

登入與登出都是對session這個資源的修改,因此url的名詞資源就可以設定為sessions,編輯ihome/api_1_0/users.py的視**件

# ihome/api_1_0/users.py

@api.route('/sessions', methods=['get', 'post', 'delete'])

def handle_sessions():

if request.method == 'post':

# 登入

return login()

elif request.method == 'delete':

# 登出

return logout()

else:

# 獲取當前登入使用者

return get_login_user()

三個請求方式分別對應:登入post,登出delete,獲取當前登入使用者get,分別編寫對應的三個函式

# ihome/api_1_0/users.py

def login():

"""登入"""

# 接收資料

post_dict = request.get_json()

if not post_dict:

return jsonify(errno=ret.paramerr, errmsg='引數不能為空')

# 提取資料

phone = post_dict.get('phone')

password = post_dict.get('password')

# 校驗資料

if not all([phone, password]):

return jsonify(errno=ret.paramerr, errmsg='引數不完整')

# 限制同一手機號一分鐘內只能登陸5次

his_login_key = f'his_login_'

try:

# incr增加記錄的次數,若不存在該key則會建立並預設值為1

count = redis_connect.incr(his_login_key)

if int(count) > constants.user_login_count:

return jsonify(errno=ret.reqerr, errmsg='一分鐘內只能登入5次')

redis_connect.expire(his_login_key, constants.user_login_expires)

except exception as e:

return jsonify(errno=ret.dberr, errmsg='獲取登入記錄異常')

# 校驗是否已經登入過

if phone in session.values():

return jsonify(errno=ret.ok)

# 校驗手機號是否註冊過

try:

user = users.query.filter_by(phone=phone).first()

except exception as e:

return jsonify(errno=ret.dberr, errmsg='獲取使用者資訊異常')

# 將使用者名稱錯誤和密碼錯誤放在一起返回,不要返回地太細節

if not user or not user.check_password_hash(password):

return jsonify(errno=ret.pwderr, errmsg='使用者名稱或密碼不正確')

# 記錄登入session

session['user_id'] = user.id

session['name'] = user.name

session['phone'] = phone

return jsonify(errno=ret.ok)

def logout():

"""登出"""

# 判斷是否登入過

if not session.get('user_id'):

return jsonify(errno=ret.nodata, errmsg='使用者未登入')

# 清除session

session.pop('user_id')

session.pop('name')

session.pop('phone')

return jsonify(errno=ret.ok)

def get_login_user():

"""獲取登入使用者"""

# 判斷是否登入過

name = session.get('name')

if name:

return jsonify(errno=ret.ok, data=)

return jsonify(errno=ret.sessionerr, errmsg='使用者未登入')

在登入的js檔案中新增登入按鈕的邏輯,同樣不使用form自帶的表單提交功能,自定義表單的提交與返回操作

$(document).ready(function()  

if (!passwd)

//傳送ajax請求

//js物件資料轉換為json格式

var postdata = json.stringify();

$.ajax(,

datatype: 'json',

success: function (resp) else}})

});})

登入成功後,進入主頁頁面,在主頁的右上角顯示登入的使用者名稱,編輯主頁js檔案,頁面一載入就呼叫介面查詢登入的使用者

點選主頁的使用者名稱,來到使用者資訊頁面,最下面的'退出'按鈕即為登出功能,設定該按鈕的點選事件為logout()編輯該介面的js

function logout() ,

success: function (resp) else}})

}

有些頁面是需要使用者登入才能訪問的,比如使用者資訊頁面,因此我們需要在這些頁面的檢視函式上新增登入的驗證,這裡使用裝飾器的方式,在ihome/utils/commons.py檔案中新增該登入裝飾器

# ihome/utils/commons.py

from flask import session, jsonify, g

from .response_codes import ret

import functools

def login_required(view_func):

"""登入驗證裝飾器"""

@functools.wraps(view_func)

# 判斷登入狀態

user_id = session.get('user_id')

if not user_id:

# 沒有登入

return jsonify(errno=ret.sessionerr, errmsg='使用者未登入')

# 已登入,將user儲存在g物件中

try:

user = users.query.get(user_id)

g.user = user

print(g.user)

except exception as e:

return jsonify(errno=ret.dberr, errmsg='獲取使用者異常')

# 執行檢視函式

return view_func(*args, **kwargs)

注:

在session中若未獲取到登入使用者,則返回錯誤資訊,使用者未登入,若已登入,則執行下面的被裝飾的檢視函式

在裝飾器內部新增@functools.wraps(view_func)能使被裝飾函式的檔案字串等屬性不會改變

在可以講獲取到的一些資訊存在g變數中,這樣在檢視函式中就不需要重複查詢, 這裡將當前登入的user物件存在g物件中

Flask愛家租房 城區資訊

城市列表使用快取的過程 獲取城區資訊 嘗試從redis中讀取資料 try resp json redis store.get area info except exception as e else if resp json is notnone redis有快取資料 hit redis area ...

Flask練手專案《愛家租房》 從開始 到總結

ps 有原始碼 但是都是一團糟js js 寫不到點子上 html html 跳轉異常 前天 10.14 經歷了半天 修改好了登入註冊,實在是無力在繼續改下去 拿著靜態資源 去flask 進行二次開發 截止目前為止,除去登入驗證碼,和redis 快取手機驗證碼,基本功能已實現 begingithub ...

Flask專案結構

專案排版 首先建立專案目錄 mkdir flask tutorial cd flask tutorial接下來按照前一篇講過的安裝flask步驟進行安裝,並新建乙個虛擬環境。flask應用可以簡單到使用乙個單檔案,例如hello.py from flask import flask defhello...