這次我主要講解如何用python基於flask的登入和註冊,驗證方式採用basic auth
主要用以下庫
import os
#flask的基礎庫
from flask import flask, abort, request, jsonify, g, url_for
#flaks的資料庫操作的庫
from flask.ext.sqlalchemy import sqlalchemy
#flask登入註冊的庫
#加密解密密碼的庫
#url安全序列化工具
from itsdangerous import (timedjsonwebsignatureserializer
as serializer, badsignature, signatureexpired)
# 設定金鑰
# 資料庫的配置
#資料庫初始化
# 驗證的初始化
sqlalchemy是orm模型運算元據庫的,所以是非常的方便
除了基本的屬性之後我們我定義了一些必要的方法
class
user
(db.model):
__tablename__ = 'users'
id = db.column(db.integer, primary_key=true)
username = db.column(db.string(32), index=true)
password_hash = db.column(db.string(64))
# 加密密碼
defhash_password
(self, password):
self.password_hash = pwd_context.encrypt(password)
# 驗證密碼
defverify_password
(self, password):
return pwd_context.verify(password, self.password_hash)
# 生成token,並設定過期時間
defgenerate_auth_token
(self, expiration=600):
return s.dumps()
# 靜態的驗證token的方法
@staticmethod
defverify_auth_token
(token):
try:
data = s.loads(token)
except signatureexpired:
return
none
# token過期
except badsignature:
return
none
# token無效
user = user.query.get(data['id'])
return user
def
new_user
(): username = request.json.get('username')
password = request.json.get('password')
if username is
none
or password is
none:
abort(400) # 使用者名稱或者密碼為空
if user.query.filter_by(username=username).first() is
notnone:
abort(400) # 使用者已存在
user = user(username=username)
# 加密密碼
user.hash_password(password)
# 儲存進資料庫
db.session.add(user)
db.session.commit()
# 成功註冊後返回使用者名稱,location後面接著的是跳轉的位址
return (jsonify(), 201,
)
# 登入後獲取token
@auth.login_required
defget_auth_token
():# 設定token過期時間
token = g.user.generate_auth_token(600)
return jsonify()
獲取token後之後,每次請求只需傳token就好了
# 可以通過token或者賬號密碼登入
@auth.login_required
defget_resource
():# 如果token有效的話就返回username
return jsonify()
細心的人會發現上面這兩個方法前都帶有@auth.login_required,這其實就是奧妙之處
# 有@auth.login_required標誌的都要呼叫這個方法,傳token或者傳賬號和密碼
@auth.verify_password
defverify_password
(username_or_token, password):
# 首先驗證token
user = user.verify_auth_token(username_or_token)
ifnot user:
# 然後再驗證使用者名稱和密碼
user = user.query.filter_by(username=username_or_token).first()
ifnot user or
not user.verify_password(password):
return
false
g.user = user
return
true
if __name__ == '__main__':這樣就大功告成了# 如果這個資料庫不存在就建立
ifnotos.path.exists('db.sqlite'):
db.create_all()
分享一套 python 試題
賴勇浩 今天在 is better.com 看到一篇 python 面試題集合 同時附在了此文下方 裡面有一些很好的試題,如 python是如何進行型別轉換的?也有一些讓人 的試題,如 python如何實現單例模式?其他23種設計模式python如何實現?在引我思考的同時,也讓我產生把自己之前招聘所...
標題 怎樣將某一套帳中的表轉入另一套帳
在財務軟體的正常的維護中 經常會遇到將某一套帳的某乙個或幾個表轉入另 一套帳中 可以用下面的方法實現 一 在單使用者中,利用 output 和input 轉出 select from lspzk1 output to d lspzk1.txt format ascii 轉入 input into l...
搭建一套簡單的CDN網路
目前對於cdn網路搭建技術有很多成熟的商業方案,對於資金受限的 可能無法自己搭建或購買。這裡提供了一套簡單的實現cdn網路的技術架構,所使用的軟體全部是開源高效且免費的。根據cdn網路技術原理,必須有乙個動態dns伺服器,開源的可以使用bind,免費,而且原 開放。不修改 bind基本上可以實現簡單...