接着前面:使用Python写一个WEB服务器
现在我们需要考虑的是如何从数据库中获取数据并传给前台页面了
这里使用的是Flask_SQLalchemy管理sqlite数据库
定义一下基本的属性
from flask_sqlalchemy import SQLAlchemy #导入数据库连接
db = SQLAlchemy(app) #数据库实例
app.config['SQLALCHEMY_DATABASE_URI'] = dburl #数据库路径
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True #请求结束自动提交
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False #忘记了 改善性能的貌似
接着就是定义模型了,这里开始根据你想搭建的网站内容就开始有变化了。我随大流,来个超级精简博客。
#定义数据库对象
class User(db.Model): #定义用户,后台发博文
__tablename__ = 'users' #定义表名
id =db.Column(db.Integer,primary_key = True) #定义列名 属性 必须有主键
name =db.Column(db.String(128),unique = True,index = True,nullable = False,default ='NoName')#定义name 不可重复,创建索引,不能为空,默认值
password =db.Column(db.String(128),unique = False,index = False,nullable = False)
articles =db.relationship(Article,backref='user',lazy='dynamic')
class Article(db.Model):#定义文章
__tablename__ = 'articles'
id =db.Column(db.Integer,primary_key = True) #定义列名 属性 必须有主键
title =db.Column(db.String(256),unique = False,index = True,nullable = False)
noveltext =db.Column(db.Text,unique = False,index = False,nullable = False)
time =db.Column(db.Text) #这里我嫌麻烦 直接字符串了
auth_id =db.Column(db.Integer,db.ForeignKey('users.id'))
__tablename__属性决定对应的表
两个类的最后一个属性的作用是构成外键,当然对于我个人来说我更喜欢使用弱相关的方式(即代码实现逻辑上的相关)而不是使用数据库的外键。
在实现注册登录之前,我们还等解决一个问题——表单:
from flask import session
from flask_wtf import FlaskForm #导入表单
from wtforms importStringField,PasswordField,SubmitField #导入普通文本框、密码文本框、确认按钮
from wtforms.validators import Required #导入非空文本验证
#定义表单
class MyLoginForm(FlaskForm): #定义一个类,继承From
name =StringField('input you name',validators=[Required()])#定义name属性为普通文本框 ,验证非空
password =PasswordField('input you password')#定义password属性 为密码框
submit =SubmitField('go!')
然后新建一个login的路由:
@app.route('/login',methods=['GET','POST'])
def login():
loginform =MyLoginForm()
title ='welcome!'
ifloginform.validate_on_submit:#如果表单非空提交
ifsession['name']:
password = loginform.password.data
user= User.query.filter_by(name = session['name'],password = password).first()
ifuser is None :
title = 'fail!'
else:
title = 'success!'
session['name']= loginform.name.data
#do something ……
name = session.get('name')
password =session.get('password')
returnrender_template('login.html',title = title,loginform = loginform)
解释一下过程:当第一请求页面时loginform.validate_on_submit为False,那么将会直接使用jinja2渲染login.html返回给用户,title为welcome!,当用户提交数据登录时,loginform.validate_on_submit为True,就会在数据库匹配用户名和密码,如果存在同名同密码用户则成功并将用户名存入session,然后就可以跳转到其他页面了;否则失败将接着返回登录页面title为fail!
html页面可以使用flask_wtf的自动快速渲染,无需修改。
{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Edit{% endblock %}
{% block body %}
<div class="page-header">
<h1>{{title }}</h1>
</div>
<div class="col-md-4">
{{wtf.quick_form(loginform) }}
</div>
{% endblock %}
这样就完成了整个的登录界面
(可以使用flash完成消息提醒)
同样的我们可以完成注册功能的实现,这里仅提醒一点:
导入Length(长度验证),Regexp(正则匹配验证),EqualTo(文本一致性验证)模块,可以对用户名,密码,重复密码进行验证
同样的实现了文章部分的功能后,整个系统就已经初步完成了。