flask_sqlalchemy使用字符串的哈希作为主键

时间:2018-08-19 10:43:35

标签: python sqlalchemy

如何修改此示例以将sha256字段的username值用作primary key而不是autoincremented index

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

示例取自此处: http://flask-sqlalchemy.pocoo.org/2.3/quickstart/#a-minimal-application

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但是最简单的方法就是在您的route.py文件中:

...
from hashlib import sha256

@app.route('/register') 
def register():

    if form.validate_on_submit():
        username_hash = sha256(form.username.data.encode()).hexdigest()
        user = User(id=username_hash)
     ...

如您所见,这有两个部分。用户名通常将是str,必须被称为encode才能成为类型bytes。然后只需从标准库中调用sha256和hexdigest即可返回哈希值的方法。

具有“唯一”哈希值可能很有用,但是拥有唯一的整数id则不会重复,可以很容易地在行下引用。为了调试和查找flask-shell中的用户,通过简单的整数而不是其他属性或哈希进行查找可能会更容易。

这可能更简单:

User.query.get(14)

比起使用散列作为主要ID。