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

顶层文件下还有虚拟环境 venv,配置文件config.py,主程序 flasky.py


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


在注册,登录,以及博客编辑 都需要用到表单来处理提交的信息。
我们以登录界面的 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')
处理表单的文件写好了,就要写一个登录界面了。登录界面都放在 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 %}
我们可以得到这样的界面:

模板建立后,就要对视图函数修改
客户端把请求发送给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)
有了用户之后,我们就得用到数据库
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')
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
db.create_all()
当然,我们的博客里肯定有多张表,表之间还有联系,这里我们在数据库的博客中再仔细讲哦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。