今晚完成了web表单制成的登录界面和与flask的sql结合的例子
首先一点就是:
import os
from flask import Flask, render_template, session, redirect, url_for,flash
from flask_script import Manager, Shell
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask_wtf import Form
from wtforms import StringField, SubmitField ,PasswordField,BooleanField
from wtforms.validators import Required
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <flasky@example.com>'
app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN')
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
看见没,这是写这个程序之前需要准备的配置和初始化,幸好源码里面都有这些,令现在的我暂时是送了一口气
然后先说表单,首先在Flask的框架里面定义好表单,后来发现也可以自己写一个文件来保存表单,用的时候导入即可。然后在模版里面进行渲染,这样基础的表单就出来了:
class loginForm(Form):
name = StringField('Username', validators=[Required()])
password=PasswordField('Password',validators=[Required()])
remember_me=BooleanField('Keep login')
submit = SubmitField('login')
表单的定义如上,然后在模版里面,{{wtf.quick_form(form)}},这就是wtf的制成表单功能。
其次,数据库的定义也很简单
class User(db.Model):
__tablename__='users'
username=db.Column(db.String(64),primary_key=True)
password=db.Column(db.Integer)
def __repr__(self):
return '<User %r>' % self.username
当然这里我没有用到数据库关系。然后,对数据库的操作是在windows的dos下进行的
还有删改查等功能也是以后经常需要使用的
最后,今天对路由和视图函数这里进一步理解
@app.route('/',methods=['GET','POST'])
def index():
form=loginForm()
if form.validate_on_submit():
name=User.query.filter_by(username=form.name.data).first()
word=User.query.filter_by(password=form.password.data).first()
if name is None and word is None:
newuser=User(username=form.name.data,password=form.password.data)
db.session.add(newuser)
session['know']=False
else:
session['know']=True
session['name']=form.name.data
form.name.data=''
return redirect(url_for('index'))
return render_template('index.html',form=form,name=session.get('name'),know=session.get('know',False))
form.XXX.data是获取输入的信息,挺主要的需求
而redirect辅助函数,是用来生成HTTP重定向响应。
执行的网页结果就是,登录名和密码如果是在数据库里面的话,上面信息会显示欢迎XX;如果不在数据库里,则显示no,然后把新用户加入数据库
在dos下输入query可以看到新增了数据
以下是源代码
# -*- coding: utf-8 -*-
import os
from flask import Flask, render_template, session, redirect, url_for,flash
from flask_script import Manager, Shell
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask_wtf import Form
from wtforms import StringField, SubmitField ,PasswordField,BooleanField
from wtforms.validators import Required
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, MigrateCommand
basedir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['MAIL_SERVER'] = 'smtp.googlemail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]'
app.config['FLASKY_MAIL_SENDER'] = 'Flasky Admin <flasky@example.com>'
app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN')
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class loginForm(Form):
name = StringField('Username', validators=[Required()])
password=PasswordField('Password',validators=[Required()])
remember_me=BooleanField('Keep login')
submit = SubmitField('login')
class User(db.Model):
__tablename__='users'
username=db.Column(db.String(64),primary_key=True)
password=db.Column(db.Integer)
def __repr__(self):
return '<User %r>' % self.username
@app.route('/',methods=['GET','POST'])
def index():
form=loginForm()
if form.validate_on_submit():
name=User.query.filter_by(username=form.name.data).first()
word=User.query.filter_by(password=form.password.data).first()
if name is None and word is None:
newuser=User(username=form.name.data,password=form.password.data)
db.session.add(newuser)
session['know']=False
else:
session['know']=True
session['name']=form.name.data
form.name.data=''
return redirect(url_for('index'))
return render_template('index.html',form=form,name=session.get('name'),know=session.get('know',False))
if __name__=='__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% extends "bootstrap/base.html"%}
{% block title %}登录{% endblock %}
{%block content %}
<div class="content">
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alter"></button>
{{message}}
</div>
{% endfor %}
{% block page_content %}{% endblock %}
</div>
{% endblock %}
</head>
{% block head %}
{{super()}}
<link rel="shortcut icon" href="{{url_for('static',filename='kobe.jpg')}}" type="image/x-icon">
<link rel="icon" href="{{url_for('static',filename='kobe.jpg')}}" type="image/x-icon">
{%endblock%}
<body>
</body>
</html>
{% extends "login-base.html"%}
{% import "bootstrap/wtf.html" as wtf %}
{% block title%}登录{% endblock %}
{% block page_content %}
<div class="page-header">
{% if not know %}
<p>This is no user</p>
{% else %}
<p>Welcome to here,{{name}}</p>
{% endif %}
</div>
{{wtf.quick_form(form)}}
{%endblock%}