Flaskweb实战开发的总结(前6章)

首先是对模板的介绍,jinja2模板渲染有着很强大的功能,可以帮助我们实现动态,继承的需求.通过传入参数,我们可以直接动态的为模板绑定变量.通过继承,可以大大的减少所需要的Html的代码量.并且更好的组织结构.

对于继承,jinjia2模板采用的是{%block %}content{%endfor%}的模式来实现的,我们可以在模板里面添加或者重置我们需要的东西.如果需要添加,就应该用{{super()}}的形式,先添加爱base模板的内容.

由于对表单进行样式的设置是一件比较枯燥的事情,所以我们可以选择flask-bootstrap这个轻量级的flask扩展,它是对botstrap进行了flask的包装,利用它,我们可以直接用bootstarp的样式表设置表单.这样又节省了很多的时间.同时bootstrap官方还有很多例子,这些例子都是可以直接复制下来就用的.很容易学习模仿.同时bootstrap还提供了很多对表单的验证函数.像对email的验证之类的.我们的例子就是在bootstrap的base.html的基础上进行继承的.

在响应表单的时候,采取了重定向的技术,让刷新的的最后一个请求不是POST而是GET.

对于数据库的操作前面介绍过了,就不在多言.
对于发送邮件,我们使用的是smtp协议,需要进行很多的配置,其中有一点需要注意:书上用的是smtp.google.com,由于都懂的原因我们必须使用国内的smtp服务,比如163。另外,发送邮件可以单独开一个线程,这样我们就可以在避免掉发送邮件造成的对网页响应的延迟.

最后来个代码总结下:

from flask import Flask,session,render_template,redirect,url_for,flash
from flask.ext.script import Manager
from flask.ext.bootstrap import Bootstrap
from flask.ext.wtf import Form
from wtforms import StringField,SubmitField
from wtforms.validators import Required,Email
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flask
from sql_learn import User
import pymysql,os
from flask.ext.mail import Mail,Message
from threading import Thread

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:19931218@localhost/test'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = '[email protected]'#input('Your Email account')
app.config['MAIL_PASSWORD'] = 'XXXXXXX'#input('your Email password')
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <[email protected]>'
app.config['FLASKY_ADMIN'] = '[email protected]'
mail = Mail(app)
db = SQLAlchemy(app)
boots = Bootstrap(app)

def send_async_email(app, msg):#异步发送邮件
    with app.app_context():#创建程序上下文. (push/pop),其实就是让current_app指向当前的app
        mail.send(msg)
def send_email(to, subject, template, **kwargs):
    msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject,sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
    msg.body = render_template(template + '.txt', **kwargs)
    msg.html = render_template(template + '.html', **kwargs)
    thr = Thread(target=send_async_email, args=[app, msg])#创建一个线程,目标函数是异步发送的邮件
    thr.start()#开启线程
    return thr

#*********名字表单*****************#
class NameForm(Form):
    name = StringField('What is your name?', validators=[Required()])#文本框
    submit = SubmitField('Submit')#提交表单,大都作为POST方法来提交
@app.route('/',methods = ['GET','POST'])#在URL注册的时候将这个这个视图函数注册为GET和POST,如果没有指定,就ishi只有GET
def index():
    form = NameForm()
    if form.validate_on_submit():#如果表单的数据是有效的
        user = User.query.filter_by(username=form.name.data).first()#在数据库里面查询
        if user is None:
            user = User(username = form.name.data,email = '')
            print(user)
            #db.session.add(user)
            session['known'] = False
            if app.config['FLASKY_ADMIN']:
                #send_email(app.config['FLASKY_ADMIN'], 'New User','mail/new_user', user=user)
                print('sucess send email')
        else:
            session['known'] = True
        session['name'] = form.name.data#获取表单中name字段的数据并且保存在会话里面,注意如果传入form.name就会变成一个输入框..
        form.name.data = ''#把表单数据清空
        return redirect(url_for('index'))#使用重定向,把post请求的响应指向一个url,这样就会产生一个get请求
    return render_template('index.html',form = NameForm(),name = session.get('name'),known = session.get('known'))
@app.route('/user/')
def user(name):
    return render_template('user.html',name = name)
if __name__ == '__main__':
    app.run()#直接运行在5000端口上面

****base.html*

{% extends "bootstrap/base.html" %}
{% block title %}Flasky{% endblock %}
{% block navbar %}
<div class="navbar navbar-inverse" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle"
            data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigationspan>
                <span class="icon-bar">span>
                <span class="icon-bar">span>
                <span class="icon-bar">span>
            button>
            <a class="navbar-brand" href="/">Flaskya>
        div>
        <div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Homea>li>
ul>
div>
div>
div>
{% endblock %}
{% block content %}
<div class="container">
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">×button>
{{ message }}
div>
{% endfor %}
{% block page_content %}{% endblock %}
div>
{% endblock %}

index.html****

{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}
<div class="page-header">
    <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!
    {%if not known%}
    <p>Pleased to meet you!p>
    {%else%}
    <p>Happy to see you again!p>
    {%endif%}
    h1>
div>
{{ wtf.quick_form(form) }}
{% endblock %}

界面:

Flaskweb实战开发的总结(前6章)_第1张图片

你可能感兴趣的:(flask,Python)