我已經用flask_login編寫了Flask服務器。要登錄用戶,我使用login_user(user)
,並且我的網站上有一頁用@login_required
加以保護。作爲一個客戶,我使用Python請求包,這是代碼:Flask服務器上的會話與Python請求包不起作用
import requests
sess = requests.session()
sess.post("http://page.on/my/site", data={"login" : "login", "password" : "password"})
一切皆與此認證OK,但後來我試圖訪問受保護的頁面:
r = sess.get("http://secure.page/on/the/site")
而這個請求接收Unauthorized
。 設置身份驗證後,這是餅乾(現在我有我的本地主機上的服務器):
<RequestsCookieJar[<Cookie session=.eJwdzjkSwjAMAMC_uE4h2dbhfCZjHR5oE1Ix_B2Gbst9l2OdeT3K_jrv3MrxjLKX5tqBGbq7MfmPiYi8aA7RAG8haZJoDZ0HrlSG6Oa1-yCqsaJNJlSVAQToNXsAt8UiFQBIbIa3bmYiarYyiEaNsUJjmlLZyn3l-c_Uzxf_2C6a.Cnf0yA.xIUSIFgcvjqwszrbwCA_D2Rqa5k for localhost.local/>]>
順便說一句,我也用這個:
login_manager.session_protection = "strong"
如何解決此身份驗證問題?
UPD:
這是服務器的登錄代碼:
@api.route("/login/", methods=["POST"])
def handle_login_request():
login, password = str(request.form['login']).lower(), str(request.form['password'])
# Get and check user here
login_user(user)
# update user and get user_data
return jsonify(user_data)
抵押路線:
@api.route("/users_of_group/")
@login_required
def get_user_of_users_group():
# code here never executes because of @login_required
api
是燒瓶藍圖的名稱
UPD2:
這是由sess.get
返回頁面的內容:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>401 Unauthorized</title>
<h1>Unauthorized</h1>
<p>The server could not verify that you are authorized to access the URL requested. You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.</p>
UPD3: 我試圖用這樣的:
r = sess.get("http://secure.page/on/the/site", auth=("login", "password"))
在我所看到的,在第一個用戶成功登錄服務器,但那麼無論如何服務器都會拋出401。
import requests
sess = requests.session()
login = sess.post("http://page.on/my/site", data={"login" : "login", "password" : "password"})
r = sess.get("http://secure.page/on/the/site", cookies=login.cookies)
另外登錄用戶,然後拋出401
UPD4:
問題似乎是在login_user函數,它不會改變is_authenticated
到True
。我使用SQLAlchemy,這是我的用戶等級:
class User(db.Model):
user_id = db.Column(db.Integer, primary_key=True)
# Many required for my app fields
is_active = db.Column(db.Boolean, default=False)
is_authenticated = db.Column(db.Boolean, default=False)
is_anonymous = db.Column(db.Boolean, default=False)
is_online = db.Column(db.Boolean, default=False)
# Init function
def get_id(self):
return str(self.user_id)
而且user_loader
:
@login_manager.user_loader
def load_user(user_id):
print(user_id, type(user_id))
user = User.query.filter_by(user_id=int(user_id)).first()
print(user.login, user.is_authenticated)
return user
標識打印正確,它的類型是str
,查詢工作得很好,但我仍然得到Unauthenticated
錯誤,並在最後的print
user.is_authenticated
是假的。
UPD5:
其實user.is_authenticated
只是login_user
印刷後也顯示的是假的,即使我login_user
後叫session.commit()
。
根據文檔,當會話保護處於活動狀態時,每個請求都會爲用戶計算機生成一個標識符(基本上是IP地址和用戶代理的安全哈希)。因此,它不會看起來這是一個問題。你能發佈一個完整的[mcve]嗎? –
@WayneWerner,查看我的更新回答 –
您錯過了您的問題中的用戶加載器和您的用戶類,但很可能我的答案解決了您的問題。 –