当前位置:   article > 正文

Flask Web开发 博客实例(一)flask框架理解_flask web blog

flask web blog

一、关于flask框架的理解

单脚本文件编写,可以参考大神博客https://www.cnblogs.com/senlinyang/p/8341774.html
有的小伙伴不理解flask结构里面那么多包和模块,所以本篇博客主要针对 flask 整个框架的理解,将陆续添加各个细节的链接。

  • flask应用一般保存在包app中:api文件夹下是api接口相关文件,auth文件夹下是用户登录后相关文件,main文件夹下是主页面,static是一些静态文件,templates中是html文件。另外,models用来处理数据库,forms处理表单提交信息,views中是视图函数。
  • 数据库迁移脚本在migrations文件夹中。
  • 单元测试在 tests文件夹中
  • 当然还有python虚拟环境在venv,这里截图没截到

在这里插入图片描述
顶层文件下还有虚拟环境 venv,配置文件config.py,主程序 flasky.py

在这里插入图片描述
在这里插入图片描述

1.1config

应用常常需要设定多个配置,因为需要使用不同的数据库,这样才能彼此不影响。

  • 在单脚本中,我们有这样类似字典的 app.config对象
    在这里插入图片描述
  • 在项目结构中,我们使用配置类 Config。
    具有层次结构的配置类代替之前 app.config 对象;
    基类 Config 中包含通用配置;
    三个子类中, SQLALCHEMY_DATABASE_URI 变量都被指定了不同的值,这样可以用于不同的数据库。
    在这里插入图片描述
1.2 forms表单:

在注册,登录,以及博客编辑 都需要用到表单来处理提交的信息。
我们以登录界面的 class LoginForm 为例:

class LoginForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Length(1, 64),
                                             Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    remember_me = BooleanField('Keep me logged in')
    submit = SubmitField('Log In')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
1.3登录界面

处理表单的文件写好了,就要写一个登录界面了。登录界面都放在 templates 文件夹中。

模板是包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染,需要使用到 Jinja2 模板引擎。

模板的内容可以参考链接:Flask Web开发 博客实例(二)模板

我们以 login.html 登录模板为例:

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}

{% block title %}Flasky - Login{% endblock %}

{% block page_content %}
<div class="page-header">
    <h1>Login</h1>
</div>
<div class="col-md-4">
    {{ wtf.quick_form(form) }}
    <br>
    <p>Forgot your password? <a href="{{ url_for('auth.password_reset_request') }}">Click here to reset it</a>.</p>
    <p>New user? <a href="{{ url_for('auth.register') }}">Click here to register</a>.</p>
</div>
{% endblock %}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

我们可以得到这样的界面:
在这里插入图片描述

1.4视图函数

模板建立后,就要对视图函数修改

客户端把请求发送给web 服务器,web服务器再把请求发送给flask 应用实例。处理URL和函数之间关系的,就是路由了。最简单的路由是 app.route 装饰器。而 index() 这样处理入站请求的函数,称为视图函数

我们以 auth/ views/ def login 为例:

@auth.route('/login', methods=['GET', 'POST'])
def login():
    # 创建表单实例
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data.lower()).first()
        if user is not None and user.verify_password(form.password.data):
            login_user(user, form.remember_me.data)
            next = request.args.get('next')
            # 如果验证不正确,重定向
            if next is None or not next.startswith('/'):
                next = url_for('main.index')
            return redirect(next)
        flash('Invalid email or password.')
    return render_template('auth/login.html', form=form)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
1.5数据库

有了用户之后,我们就得用到数据库

  • sqlalchemy

Flask-SQLAlchemy 简化了Flask应用中使用 SQLAlchemy 的操作。SQLAlchemy是一个强大的数据库框架。

class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')


class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
        'sqlite://'
    WTF_CSRF_ENABLED = False


class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(basedir, 'data.sqlite')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
class Role(db.Model):
    '''
    __tablename__ 定义在数据库中使用的表名
    db.Column 类构造函数的第一个参数是数据库列和模型属性
    __repr()__ 方法返回一个可读的字符串
    db.relationship 第一个参数表明,这个关系的另一端是哪个模型(类)
    '''
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    default = db.Column(db.Boolean, default=False, index=True)
    permissions = db.Column(db.Integer)
    users = db.relationship('User', backref='role', lazy='dynamic')

    def __init__(self, **kwargs):
        super(Role, self).__init__(**kwargs)
        if self.permissions is None:
            self.permissions = 0
            
    def __repr__(self):
        return '<Role %r>' % self.name
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 创建表时,可以运行
db.create_all()
  • 1

当然,我们的博客里肯定有多张表,表之间还有联系,这里我们在数据库的博客中再仔细讲哦。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51567?site
推荐阅读
相关标签
  

闽ICP备14008679号