mongoengine 自定義 id

Flask 項目中使用 mongo 的時候,定義模型我喜歡讓框架自動生成 Id 字段,非常方便,不需要自己去已 UUID 或者其他自增形式去生成。一般框架自動生成的 Id 字段類型是 ObjectId,在數(shù)據(jù)庫總中的展示形式是 "id": ObjectId("xxx") 。在查詢時通過 get 都可以輕松地獲取到括號里的字符串,所以我們在傳遞 id 時還是以非常熟悉的字符串格式。

但是最近用上 flask-jwt 插件,碰到一個小坑。Flask-JWT 是實現(xiàn) jwt 的一個框架,也是基于 PyJWt。jwtjson web token,之前在實現(xiàn)一些項目時盡管以 restful 的形式釋放出一些接口,但是用到了 session 來保存登錄狀態(tài),并且將 session 信息保存在瀏覽器 cookie 中,每次請求帶上它讓服務(wù)器驗證是否登錄。這就不符合 rest 無狀態(tài)的定義, 真正的 rest 應(yīng)該是每一次請求都是無狀態(tài)的,后端不需要保存狀態(tài)而能夠驗證請求的權(quán)限。這次采用的 jwt 就是把一些自定義的一些信息(比如 id)用密鑰加密變?yōu)橐粋€形式為 xxx.xxx.xxx 的一長串字符串即所謂的 token, 具體這三段如何生成可查看 jwt 官網(wǎng)。在用戶登錄后生成 token 傳給前端,此后每個請求都得在請求頭帶上 token ,這樣服務(wù)器不需要儲存登錄狀態(tài),只是根據(jù)密鑰和加密算法來計算這個 token 是否過期是否被篡改,自然每次請求都是無狀態(tài)的。

Flask-JWT 中實現(xiàn)認證方法時之前我這樣寫的:

class Auth():

    def authenticate(self, username, password):
        ...

    def identity(self, payload):
        user_id = payload['identity']
        return User.objects(id=user_id).first()

identity 獲取 id 的過程中發(fā)現(xiàn) id 不是一個可以序列化的變量就會報錯,此時還是得改為字符串類型方便一點。于是我在定義 model 的地方添加 id = db.StringField(required=True, unique=True),自己來通過 UUID 生成,但還是報錯,原來這樣并不能讓系統(tǒng)取消生成 id,官方文檔中說:

Alternatively, you may define one of your own fields to be the document’s
“primary key” by providing primary_key=True as a keyword argument to a >field’s
constructor. Under the hood, MongoEngine will use this field as the id; in >fact
id is actually aliased to your primary key field so you may still
use id to access the primary key if you want:

>>> class User(Document):
...     email = StringField(primary_key=True)
...     name = StringField()
...
>>> bob = User(email='bob@example.com', name='Bob')
>>> bob.save()
>>> bob.id == bob.email == 'bob@example.com'
True

primary_key 給誰誰就是 id ,就是這么簡單粗暴,但是為了語言好看我字字段名還是 id,問題解決。

    id = db.StringField(primary_key=True)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 22年12月更新:個人網(wǎng)站關(guān)停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,401評論 22 257
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • FLASK框架 簡介: flask是一個非常小的python web框架 只提供了一個強勁的核心 其它都...
    riverstation閱讀 2,393評論 2 38
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,303評論 2 89
  • iOS program design & system consultation if you have any ...
    diaodiaode520閱讀 372評論 0 0

友情鏈接更多精彩內(nèi)容