python - 在 Flask 中注册用户时 session 不可用

标签 python python-3.x flask

我正在学习 Flask,并尝试创建 Flask 后端并创建 Rest api 并使用 mongoengine 作为数据库。 python app.py 运行成功,但是当我在 postman 中传递电子邮件和密码时,我得到 The session is unavailable because no Secret key was set.注册用户时,将应用程序上的 Secret_key 设置为唯一且 secret 的。有人可以帮我指出我哪里出错了吗?

app.py

from flask import Flask,render_template,request,redirect,url_for,send_file,make_response,jsonify
import sys
from flask_cors import CORS
from configuration import config
import json
from flask_login import LoginManager, login_required, login_user, logout_user, current_user
from functools import wraps, update_wrapper
from datetime import datetime
import time 

app=Flask(__name__, static_folder="build/static", template_folder="build")

app.config['MONGO_DBNAME'] = "learning"
app.config["MONGO_URI"] = 'mongodb://localhost:27017/learning'
app.config['JWT_SECRET_KEY'] = 'secret'


CORS(app)

from crud import insert, read

#Initialising flask login manager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "render_loginpage"

@login_manager.user_loader
def user_loader(id):
    user=read.user_loader(id)
    return user

@login_manager.unauthorized_handler
def unauthorized_handler():
    return redirect(url_for('render_loginpage'))

def nocache(view):
    @wraps(view)
    def no_cache(*args, **kwargs):
        response = make_response(view(*args, **kwargs))
        response.headers['Last-Modified'] = datetime.now()
        response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0'
        response.headers['Pragma'] = 'no-cache'
        response.headers['Expires'] = '-1'
        return response
    return update_wrapper(no_cache, view)


@app.route('/api/register',methods=['POST'])
def register_user():
    data=request.data
    return insert.register(json.loads(data))
if __name__=='__main__':
    app.run(host='0.0.0.0',port=5000,debug=True)

插入.py

from models.models import User,user_metadata
from datetime import datetime,timedelta
from werkzeug.security import generate_password_hash,check_password_hash
import uuid
import json
import requests
import re
import uuid
import string
import datetime
from validate_email import validate_email
import sys
sys.path.insert(0, '../')
from configuration import config
from flask import redirect,url_for
from flask_login import LoginManager, login_required, login_user, logout_user, current_user


def register(data):
    try:
        if len(data['username'])>4 and len(data['password'])>6 and validate_email(data['email'])==True:
        userid = str(uuid.uuid4())
User(userid=userid,name=data['username'],email=data['email'],password=generate_password_hash(data['password']),date_added=datetime.datetime.utcnow(),verifiedemail=True).save()
            exp = datetime.datetime.utcnow() + timedelta(days=2)
            user_metadata(userid=userid, active=True, expire_date=exp).save()
            user = User.objects(email=data['emailid']).first()
            login_user(user)
            return 'verified'

        else:
            if len(data['username'])<5:
                raise Exception('Given Name is too short')
            elif len(data['password'])<6:
                raise Exception('Given Password is too short')
            elif validate_email(data['email'])==None:
                raise Exception('Given Email Id format is invalid')
    except Exception as e:
        errormessage=str(e)
        errorname=errormessage.split(') (')
        if errorname[0]=='(pymysql.err.IntegrityError':
            return 'This Email Id already exists'
        else:
            return errormessage

models.py

import datetime
from flask_login import  UserMixin
from flask_mongoengine import MongoEngine
import sys
sys.path.append('../')

from configuration import config

db = MongoEngine()
class User(UserMixin, db.Document):
    userid = db.StringField(required=True,primary_key=True)
    name = db.StringField()
    email= db.StringField()
    date_added = db.DateTimeField()
    password= db.StringField()
    verifiedemail= db.BooleanField()

    def is_active(self):
        return True

    def get_id(self):
        return self.userid

    def is_authenticated(self):
        return True

    def is_anonymous(self):
        return False

class user_metadata(db.Document):
    userid=db.StringField(primary_key=True)
    active=db.BooleanField()
    expire_date=db.DateTimeField(default=datetime.datetime.utcnow())

if __name__ == "__main__":
    Base.metadata.create_all(bind=engine)


config.py

databasedetails={
    'hostname':'mongodb://localhost:27017/learning',
    'databasename':'learning',
    'port':'27017',

}

最佳答案

您的应用需要 secret_key ,与 JWT_SECRET_KEY 不同,例如

app.secret_key = 'so-secret'

关于python - 在 Flask 中注册用户时 session 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62475040/

相关文章:

python - 如何使用 MNIST 在 tensorflow 中减少权重位或更改为较低位类型?

python - 如何在Flask中处理socket.io断开的连接?

heroku - 在 Heroku 上使用 Redis 的服务器端 Flask session

python - 如何在 flask 中获取请求的到达时间戳

python - c++ 中的 xgboost 负载模型(python -> c++ 预测分数不匹配)

python - 如何将绘制的图像居中?

python - 将列表中的所有元素连接成一个字符串python

python - 迭代numpy矩阵并获取score gt的所有值

python - 使用 Pandas 在 Python 中对数据框的行子集进行分组

python - 检查函数是否包含 pass