flask连接sqlalchemy数据库,实现简单的登录跳转功能

 环境:python2.7

python库:flask,flask_wtf,wtforms,sqlalchemy

原理:运行app-连接数据库-打开登录页面-输入登录信息(错误->提示错误信息;正确跳转新的search页面)

贴上代码:

web.py

# -*- coding: utf-8 -*-
# 
# web查询接口测试
# 需要登录->输入关键字->查询
from sqlalchemy import *
from sqlalchemy.orm import scoped_session, sessionmaker
###-----------连接数据库 type=mysql   user:password  localhost
db_connect_string = 'mysql://root:root@127.0.0.1:3306/flask?charset=utf8'
ssl_args = {'ssl':{'cert':'/home//ssl/client-cert.pem',
                  'key':'/home/shouse/ssl/client-key.pem',
                  'ca':'/home/shouse/ssl/ca-cert.pem'}
            }
###创建引擎
engine = create_engine(db_connect_string, connect_args =ssl_args)
SessionType = scoped_session(sessionmaker(bind=engine, expire_on_commit=False))

###构建连接数据库函数
def get_session():
    return SessionType
####创建自动事务函数
from contextlib import contextmanager
@contextmanager
def session_scope():
    db = get_session()
    try:
        yield db
        db.commit()
    except:
        db.rollback()
        raise
    finally:
        db.close()

####-------创建数据库字段
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

Base = declarative_base()
# 创建单表
# 
###账户表account
class Account(Base):
    __tablename__ = 'account'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    pwd = Column(String(16))
###用户表account
class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    __table_args__ = (
        UniqueConstraint('id', 'name', name='uix_id_name'),
    )
###地址account
class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    address = Column(String(32))
    phone =  Column(String(32))
    user_id = Column(Integer, ForeignKey('users.id'))

###创建表
Base.metadata.create_all(engine)

##-----------------------------------分割线-------------------------------------##

######开始web脚本部分
import flask
from flask_wtf import FlaskForm
from wtforms import *
from wtforms.fields import (StringField, PasswordField,)
from wtforms.validators import DataRequired, Length
from flask import Flask, render_template, redirect,session
app = Flask(__name__)
import os
from os import path
d = path.dirname(__file__)

####定义SECRET_KEY保证安全性
app.config['SECRET_KEY'] = 'my web_test!!'
###定义登录表单字段
#user, password,submit
#再渲染到html页面

class LoginForm(FlaskForm):
    # Text Field类型,文本输入框,必填,用户名长度为4到25之间
    username = StringField('Username', validators=[DataRequired(u'.请输入用户名!!'),Length(min=4, max=25,message=u'请输入4-25个字符!')])
    # Text Field类型,密码输入框,必填,必须同confirm字段一致
    password = PasswordField('Password', validators=[
        DataRequired(u'.请输入密码!!'),
        Length(min=4, max=25,message=u'请输入4-25个字符!'),
    ])
    submit = SubmitField('login')

#####定义搜索页面字段
#key, submit
class SearchForm(FlaskForm):
    key = StringField('Key',validators=[
        DataRequired(),
        Length(min=4, max=255)
    ])
    submit = SubmitField('search')


###定义登录控制器    允许访问的方式 get/post
@app.route('/test/login', methods=['GET','POST'])
def LoginFormViews():
    ###示例登陆类
    form  = LoginForm()
    if flask.request.method == "GET":
        ####get请求就显示表单页面,渲染字段->login.html
        return render_template('login.html',form=form)
    else:
        #print form.image.data   验证通过
        if form.validate_on_submit():
            ###开始check 用户名和密码
            username  =  form.username.data
            password = form.password.data
            with session_scope() as db:
                list = db.query(Account).filter(Account.name==username, Account.pwd==password).first()
                if list:
                    print list
                    ####把用户名记入session/cookies
                    session['username'] = username
                    return redirect('/test/search')
                else:
                    return redirect('/test/login')
        else:
            #print form.errors
            ###把错误信息返回到页面
            return render_template('login.html',form=form,error=form.errors)


#######search控制器
@app.route('/test/search', methods=['GET','POST'])
def SearchFormViews():
    form  = SearchForm()
    if flask.request.method == "GET":
        ####判断是否登录
        if session.has_key('username'):
            #return 'Logged in as %s' % session['username']
            return render_template('search.html',form=form)
        else:
            return redirect('/test/login')
    else:
        #print form.image.data
        if form.validate_on_submit():
            key = form.key.data
            ####开始查询 字段
            return redirect('/test/search')
        else:
            #print form.errors
            ###把错误信息返回到页面
            return render_template('search.html',form=form,error=form.errors)


######注销控制器
@app.route('/test/logout', methods=['GET'])
def logout():
    if flask.request.method == "GET":
        ####开始注销当前用户
        session.pop('username',None)
        return redirect('/test/login')

if __name__ == '__main__':
    app.run(host='127.0.0.1',port='8888', debug=False)

同一目录下新建templates文件夹存放静态文件

_formhelpers.html  配置文件,用来循环表单字段

{% macro render_field(field) %}
<div style="height:24px;">
  <span>{{ field.label }}:</span>
  {{ field(**kwargs)|safe }}
  {% if field.errors %}
    <b class=errors style="color:red">
    {% for error in field.errors %}
      <span>{{ error }}</span>'
    {% endfor %}
    </b>
  {% endif %}
  </div>
{% endmacro %}

login.html  登录文件

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Form</title>
</head>
<body>
<div style="margin: 0 auto;width:200px; height: 40px; line-height: 40px;">登录系统</div>

    {% from "_formhelpers.html" import render_field %}
    <form action='/test/login' method='post' name='LoginFormViews' enctype="multipart/form-data">
        {{ form.hidden_tag() }}
        {#{ form.csrf_token }#} 
        <table>
        {{ render_field(form.username) }}
        {{ render_field(form.password) }}
  </table>
   {{ form.submit }}
    </form>


<hr></hr>

</body>
</html>

search.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Form</title>
</head>
<body>
<div style="margin: 0 auto;width:200px; height: 40px; line-height: 40px;">搜索({{session['username']}})<b style="color:red;"><a href="/test/logout">注销</a></b></div>

    {% from "_formhelpers.html" import render_field %}
    <form action='/test/news_form' method='post' name='NewsFormViews' enctype="multipart/form-data">
        {{ form.hidden_tag() }}
        {#{ form.csrf_token }#} 
        <table>
        {{ render_field(form.key) }}
  </table>
   {{ form.submit }}
    </form>


<hr></hr>

</body>
</html>

下次讲讲表单字段的使用,本次只是用了2种类型的字段,以及错误的提示信息。

转载于:https://www.cnblogs.com/shuangzikun/p/taotao_python_flask_login.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值