赞
踩
目前已经有很多类似GPT的大模型开源,可以提供类似ChatGPT的智能问答功能。我也基于这些开源模型,用Flask来建立一个智能问答网站,可以方便用户建立自己的ChatGPT系统。
这个网站需要提供用户登录功能,对已登录的用户,可以在网站上提出问题,并由大模型处理后返回答案。演示效果如下:
chatbot_
先定义一个config.py文件,里面定义Flask APP的secret key和数据库的配置,这里简单起见采用SQLITE作为数据库,用来存储用户数据:
- import os
- basedir = os.path.abspath(os.path.dirname(__file__))
-
- class Config:
- SECRET_KEY = "some words hard to guess"
- SQLALCHEMY_TRACK_MODIFICATIONS = False
-
- @staticmethod
- def init_app(app):
- pass
-
- class DevelopmentConfig(Config):
- SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(basedir, 'data.sqlite')
-
- config = {
- 'dev': DevelopmentConfig,
- 'default': DevelopmentConfig
- }
新建一个app目录,然后新建一个__init__.py文件,内容如下:
- from flask import Flask
- from flask_bootstrap import Bootstrap4
- from flask_moment import Moment
- from flask_sqlalchemy import SQLAlchemy
- from flask_login import LoginManager
- from flask_toastr import Toastr
- from flask_wtf.csrf import CSRFProtect
- from config import config
-
- bootstrap = Bootstrap4()
- moment = Moment()
- db = SQLAlchemy()
- login_manager = LoginManager()
- login_manager.login_view = 'auth.login'
- toastr = Toastr()
- csrf = CSRFProtect()
-
- def create_app(config_name):
- app = Flask(__name__)
- app.config.from_object(config[config_name])
- app.config.update(
- TOASTR_POSITION_CLASS = 'toast-top-center'
- )
-
- bootstrap.init_app(app)
- moment.init_app(app)
- db.init_app(app)
- login_manager.init_app(app)
- toastr.init_app(app)
- csrf.init_app(app)
-
- from .main import main as main_blueprint
- app.register_blueprint(main_blueprint)
-
- from .auth import auth as auth_blueprint
- app.register_blueprint(auth_blueprint, url_prefix='/auth')
- return app
这里定义了我们需要用到的Flask扩展并进行实例化,然后也用到了blueprint来管理路由。
在app目录新建一个models.py文件,定义用户数据模型,内容如下:
- from flask_login import UserMixin
- from werkzeug.security import generate_password_hash, check_password_hash
- from . import db
- from . import login_manager
-
- class User(UserMixin, db.Model):
- __tablename__ = 'users'
- id = db.Column(db.Integer, primary_key=True)
- username = db.Column(db.String(64), unique=True, index=True)
- password_hash = db.Column(db.String(128))
-
- @property
- def password(self):
- raise AttributeError("password is not a readable attribute")
-
- @password.setter
- def password(self, password):
- self.password_hash = generate_password_hash(password)
-
- def verify_password(self, password):
- return check_password_hash(self.password_hash, password)
-
- def __repr__(self):
- return '<User %r>' % self.username
-
- @login_manager.user_loader
- def load_user(user_id):
- return User.query.get(int(user_id))
在这个文件里,定义了一张名为users的数据表,里面有用户名和password_hash这两个字段。用户的密码将通过werkzeug提供的功能来进行hash以提高安全性。这样即使数据库泄漏,其他人也无法通过password_hash来获取原密码。
在app目录下新建一个auth目录,新建一个__init__.py文件,定义蓝图
- from flask import Blueprint
-
- auth = Blueprint('auth', __name__)
- from . import views
采用flask_wtf这个扩展来实现我们的登录表单和验证。在auth目录新建一个form.py文件,内容如下:
- from flask_wtf import FlaskForm
- from wtforms import StringField, PasswordField, BooleanField, SubmitField
- from wtforms.validators import DataRequired, Length, Email
-
- class LoginForm(FlaskForm):
- username = StringField('Username', validators=[DataRequired(), Length(1, 64)], name="username")
- password = PasswordField('Password', validators=[DataRequired()], name="password")
- remember_me = BooleanField('Keep me logged in', name="remember_me")
- submit = SubmitField('Log In')
创建一个views
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。