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

接着前面:使用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_submitFalse,那么将会直接使用jinja2渲染login.html返回给用户,titlewelcome!,当用户提交数据登录时,loginform.validate_on_submitTrue,就会在数据库匹配用户名和密码,如果存在同名同密码用户则成功并将用户名存入session,然后就可以跳转到其他页面了;否则失败将接着返回登录页面titlefail

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(文本一致性验证)模块,可以对用户名,密码,重复密码进行验证

同样的实现了文章部分的功能后,整个系统就已经初步完成了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值