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種類型的字段,以及錯誤的提示信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM