您的位置:首页 > 编程语言 > Python开发

使用Python写一个WEB服务器(续)

2018-02-07 12:59 555 查看
接着前面:使用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(文本一致性验证)模块,可以对用户名,密码,重复密码进行验证

同样的实现了文章部分的功能后,整个系统就已经初步完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python WEB Flask