吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1075|回复: 34
收起左侧

[求助] Flask 验证登录问题,求助

[复制链接]
wanbinqs 发表于 2021-6-14 16:16
[Python] 纯文本查看 复制代码
class User(db.Model):
    global pwd
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100), unique=True)
    pwd = db.Column(db.String(510))
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    userlogs = db.relationship("UserLog", backref="user") 
    def __repr__(self):
        return "<User %r>" % self.name

    def check_pwd(self, pwd):

[color=#ff0000]        return check_password_hash(self.pwd, pwd)[/color]

[Asm] 纯文本查看 复制代码
def login():
   # global pwd
    form = LoginForm()
    if form.validate_on_submit():
        data = form.data
        user = User.query.filter_by(name = data["name"]).first()
        
[color=#ff0000]        if user.check_pwd(data['pwd']):[/color]
            userlog = UserLog(
                user_id=user.id,
                ip=request.remote_addr
            )
            db.session.add(userlog)
            db.session.commit()
            session["name"] = user.name
            return redirect(url_for("home.user"))
    return render_template("home/login.html", form=form)

[Python] 纯文本查看 复制代码
def check_password_hash(pwhash: str, password: str) -> bool:
    """Check a password against a given salted and hashed password value.
    In order to support unsalted legacy passwords this method supports
    plain text passwords, md5 and sha1 hashes (both salted and unsalted).

    Returns `True` if the password matched, `False` otherwise.

    :param pwhash: a hashed string like returned by
                   :func:`generate_password_hash`.
    :param password: the plaintext password to compare against the hash.
    """
    if pwhash.count("$") < 2:
        return False

    method, salt, hashval = pwhash.split("$", 2)
    return hmac.compare_digest(_hash_internal(method, salt, password)[0], hashval)

数据库

数据库

报错

报错


求教,问题出在哪里啊,现在我的demo注册功能正常,后台可以看到注册的数据,但是登陆功能不正常,任意输入数据,都直接跳转错误。程序里的错误信息如图

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kk159 发表于 2021-6-14 17:02
丢完整代码,
 楼主| wanbinqs 发表于 2021-6-14 17:03
 楼主| wanbinqs 发表于 2021-6-14 17:08
本帖最后由 wanbinqs 于 2021-6-14 17:10 编辑
这是最关键的两个文件,hash的 都用的库里的文件啊
[Python] 纯文本查看 复制代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from werkzeug.security import check_password_hash
import pymysql, os
from flask import jsonify
app = Flask(__name__)

# 数据库配置
HOSTNAME = 'localhost'
PORT = '3306'
DATABASE = 'movic'
USERNAME = 'root'
PASSWORD = 'root'

app.config["SQLALCHEMY_DATABASE_URI"] = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
app.config["SECRET_KEY"] = os.urandom(24)
db = SQLAlchemy(app)


# 会员
class User(db.Model):
    global pwd
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100), unique=True)
    pwd = db.Column(db.String(510))
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)
    userlogs = db.relationship("UserLog", backref="user")  # 会员日志外键关联
    def __repr__(self):
        return "<User %r>" % self.name

    def check_pwd(self, pwd):

        return check_password_hash(self.pwd, pwd)

class UserLog(db.Model):
    """
    会员登录日志表
    """
    __tablename__ = "userlog"  # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 编号
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属会员
    ip = db.Column(db.String(100))  # 登录IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 登录时间;

    def __repr__(self):
        return "<UserLog %r>" % self.id



if __name__ == '__main__':
    db.drop_all()
    db.create_all()
[mw_shl_code=asm,true]from . import home
from flask import render_template, redirect, url_for, flash, session, request
from app.home.forms import RegistForm, LoginForm
from app.models import User, db, UserLog
from datetime import datetime
from werkzeug.security import generate_password_hash
from functools import wraps
from werkzeug.security import check_password_hash

# 登录装饰器
def user_login_req(func):
    @wraps(func)
    def decorated_function(*args, **kwargs):
        if "user" not in session:
            return redirect(url_for("home.login"))
        return func(*args, **kwargs)
    return decorated_function


# 前端首页
@home.route("/")
def index():
    return render_template("home/index.html")


# 用户中心
@home.route("/user")
@user_login_req
def user():
    return render_template("home/user.html")


# 用户登录
@home.route("/login", methods=["GET", "POST"])
def login():
   # global pwd
    form = LoginForm()
    if form.validate_on_submit():
        data = form.data
        user = User.query.filter_by(name = data["name"]).first()

        if user.check_pwd(data['pwd']):
            userlog = UserLog(
                user_id=user.id,
                ip=request.remote_addr
            )
            db.session.add(userlog)
            db.session.commit()
            session["name"] = user.name
            return redirect(url_for("home.user"))
    return render_template("home/login.html", form=form)


# 退出登录
@home.route("/logout",methods=["GET", "POST"])
def logout():
    form = LoginForm()
    if 'name' in session:
        session.clear()
        return redirect(url_for("home.login"))

    return render_template("home/login.html", form=form)


# 会员注册
@home.route("/register", methods=["GET", "POST"])
def register():
    form = RegistForm()
    if form.validate_on_submit():
        data = form.data
        user = User(
            name=data["name"],
            pwd=generate_password_hash(data["pwd"]),
            addtime=datetime.now()
        )
        db.session.add(user)
        db.session.commit()
        flash("注册成功", "ok")
    return render_template("home/register.html", form=form)
[mw_shl_code=python,true]
[/mw_shl_code][/mw_shl_code]
kk159 发表于 2021-6-14 17:10
wanbinqs 发表于 2021-6-14 17:08
[mw_shl_code=python,true]from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from da ...

git可以了 不用贴代码,稍等 我看看
 楼主| wanbinqs 发表于 2021-6-14 17:11
kk159 发表于 2021-6-14 17:10
git可以了 不用贴代码,稍等 我看看

感谢大佬,这几天搞这个都魔怔了,不知道问题在哪里
kk159 发表于 2021-6-14 17:18
wanbinqs 发表于 2021-6-14 17:11
感谢大佬,这几天搞这个都魔怔了,不知道问题在哪里

晚点帮你看,代{过}{滤}理有点问题 ,我要爬几个回来先,不然GitHub太慢了,,你留意pull 就ok!
 楼主| wanbinqs 发表于 2021-6-14 17:21
kk159 发表于 2021-6-14 17:18
晚点帮你看,代{过}{滤}理有点问题 ,我要爬几个回来先,不然GitHub太慢了,,你留意pull 就ok!

好的 感谢
namedlxd 发表于 2021-6-14 18:08
[Python] 纯文本查看 复制代码
def login():
    form = LoginForm()
    if form.validate_on_submit():
        data = form.data
        user = User.query.filter_by(name=data["name"]).first()
        if user is not None and user.check_pwd(data["pwd"]):


[Python] 纯文本查看 复制代码
def user_login_req(func):
    @wraps(func)
    def decorated_function(*args, **kwargs):
        if session.get('name'):
            return func(*args, **kwargs)
        return redirect(url_for("home.login"))


登录的时候要先判断是否能取到用户,登录装饰器要判断登录时 往session中放的东西
kk159 发表于 2021-6-14 18:34
1.你的安装依赖,你将系统的库都打包进去了吧?根据你的安装依赖导入根本跑不起
2.我根据你home、view里导了pymysql。flask 还有flask_sqlalchemy, 跑manage。还有要个wtf 基本跑起来。
3.不明白你用这个微电影的干嘛?反正注册我都报错了。应该是类库的问题,你先处理好这个问题,不然我无法复现你的错误。。你可以自己重新clone下 在安装库,测试能跑?
4.你的flask布局有点问题,参考我这个初始的https://github.com/leemamas/init_flask,model里面方db。。。。。。
5.从你第一个贴图报错来看,错误应该user没获取到,所以没user这个实例,自然报错提示没绑定check_pwd的方法!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 02:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表