用Flask打造一个大模型智能问答WEB网站

目前已经有很多类似GPT的大模型开源,可以提供类似ChatGPT的智能问答功能。我也基于这些开源模型,用Flask来建立一个智能问答网站,可以方便用户建立自己的ChatGPT系统。

这个网站需要提供用户登录功能,对已登录的用户,可以在网站上提出问题,并由大模型处理后返回答案。演示效果如下:

FLASK APP配置

先定义一个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
}

定义Flask App

新建一个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")
    

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-28 13:44:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-28 13:44:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-28 13:44:01       82 阅读
  4. Python语言-面向对象

    2024-01-28 13:44:01       91 阅读

热门阅读

  1. 【文本到上下文 #9】NLP中的BERT和迁移学习

    2024-01-28 13:44:01       57 阅读
  2. 新型唯一标识符 ULID 详解

    2024-01-28 13:44:01       50 阅读
  3. 计算机网络

    2024-01-28 13:44:01       56 阅读
  4. 1. HarmonyOS 应用开发 TS 准备-1

    2024-01-28 13:44:01       41 阅读
  5. 蓝桥杯-8631斐波拉契求和

    2024-01-28 13:44:01       48 阅读
  6. C语言中的extern:全局变量和函数的声明与使用

    2024-01-28 13:44:01       53 阅读
  7. RedisCluster集群扩容

    2024-01-28 13:44:01       67 阅读
  8. Elasticsearch 中使用MustNot等同于不登录遇到的坑

    2024-01-28 13:44:01       51 阅读