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