摘要:并且只有數(shù)據(jù)庫中存在用戶可以登陸網(wǎng)頁。目前,對(duì)于用戶注冊(cè),不返回?cái)?shù)據(jù)庫。用戶注冊(cè)時(shí),添加信息到數(shù)據(jù)庫中存放表單操作每個(gè)表單都由一個(gè)繼承自的類表示類表示的是屬性為的元素。當(dāng)注冊(cè)表單某一項(xiàng)不滿足程序定義的規(guī)則時(shí)當(dāng)注冊(cè)成功時(shí),返回
flask_bootstrap
Bootstrap 是 Twitter 開發(fā)的一個(gè)開源框架,它提供的用戶界面組件可用于創(chuàng)建整潔且具有吸引力的網(wǎng)頁,而且這些網(wǎng)頁還能兼容所有現(xiàn)代 Web 瀏覽器. Bootstrap 是客戶端框架,因此不會(huì)直接涉及服務(wù)器。服務(wù)器需要做的只是提供引用了 Bootstrap 層疊樣式表(CSS)和 JavaScript 文件的 HTML 響應(yīng), 并且 HTML、CSS 和 JavaScript 代碼中實(shí)例化所需組件。這些操作最理想的執(zhí)行場(chǎng)所就是模版。 Flask-Bootstrap 可以在程序中集成 Bootstrap
安裝:
pip install flask-bootstrap
使用:
from flask_bootstrap import Bootstrap ...... bootstrap = Bootstrap(app)html文件的繼承
初始化 Flask-Bootstrap 之后,就可以在程序中使用一個(gè)包含所有Bootstrap 文件的基模版。這個(gè)模版利用 Jinja2 的模版繼承機(jī)制,讓程序擴(kuò)展一個(gè)具有基本頁面結(jié)構(gòu)的基模版,其中就有用來引入 Bootstrap 的元素。
bootstrap的base.html文檔:
{% block doc -%} {%- block html %} {%- block head %}{% block title %}{{title|default}}{% endblock title %} {%- block metas %} {%- endblock metas %} {%- block styles %} {%- endblock styles %} {%- endblock head %} {% block body -%} {% block navbar %} {%- endblock navbar %} {% block content -%} {%- endblock content %} {% block scripts %} {%- endblock scripts %} {%- endblock body %} {%- endblock html %} {% endblock doc -%}
繼承Bootstrap 文件的基模版,編寫適用于自己項(xiàng)目的基模板。
{#自己編寫一個(gè)基類模板#} {% extends "bootstrap/base.html" %} {% block styles %} {{ super() }} {% endblock %} {% block navbar %} {% endblock %} {% block content %} {#定義屬于自己的block#} {% block newcontent %} {% endblock %} {% block footer %}{% endblock %} {% endblock %}
Jinja2 中的 extends 指令從 Flask-Bootstrap 中導(dǎo)入 bootstrap/base.html,從而實(shí)現(xiàn)模版繼承。Flask-Bootstrap 中的基模版提供了一個(gè)網(wǎng)頁框架,引入了 Bootstrap 中的所有 CSS 和 JavaScript 文件。
上面這個(gè)示例重新定義了3個(gè)塊,分別是對(duì) bootstrap/base.html的styles、navbar和content的改寫。這些塊都是基模版提供的,可在衍生模版中重新定義。
如果程序需要向已經(jīng)有內(nèi)容的塊中添加新內(nèi)容, 必須使用 Jinja2 提供的 super() 函數(shù)。例如,如果要在衍生模版中添加新的 CSS 文件,需要這么定義:
{% block styles %} {{ super() }} {% endblock %}使flask_bootstrap和flask_wtf編寫一個(gè)FLASK項(xiàng)目
要求:
實(shí)現(xiàn)網(wǎng)頁主頁顯示、登陸頁面顯示、注冊(cè)頁面顯示、用戶退出(注銷)。并且只有數(shù)據(jù)庫中存在用戶可以登陸網(wǎng)頁。主要通過表單來實(shí)現(xiàn)數(shù)據(jù)交互。目前,對(duì)于用戶注冊(cè),不返回?cái)?shù)據(jù)庫。
實(shí)現(xiàn)
模板文件有templates/base.html , templates/index.html , templates/login.html , templates/register.html Py文件有 zaj_run.py , zaj_ forms.py , zaj_modles.py , zaj_config.py
模板文件鏈接
鏈接:https://pan.baidu.com/s/1Uov-i8b2fZMr9fOe32tcgg 提取碼:jrbs
# zaj_run.py from flask import Flask,render_template,session,redirect,url_for from flask_bootstrap import Bootstrap from zaj_forms import LoginForm,RegisterFrom from zaj_models import isPasswdOk import functools app = Flask(__name__) app.config["SECRET_KEY"] = "SHEEN" bootstrap = Bootstrap(app) def is_login(f): """判斷用戶是否登陸的裝飾器""" @functools.wraps(f) def wrapper(*args, **kwargs): # 主函數(shù)代碼里面, 如果登陸, session加入user, passwd兩個(gè)key值; # 主函數(shù)代碼里面, 如果注銷, session刪除user, passwd兩個(gè)key值; # 如果沒有登陸成功, 則跳轉(zhuǎn)到登陸界面 if "user" not in session: return redirect("/login/") # 如果用戶是登陸狀態(tài), 則訪問哪個(gè)路由, 就執(zhí)行哪個(gè)路由對(duì)應(yīng)的視圖函數(shù); return f(*args, **kwargs) return wrapper @app.route("/") def index(): return render_template("index.html") @app.route("/login/",methods=["GET","POST"]) def login(): # session.pop("user",None) # session.pop("passwd",None) form = LoginForm() print(form.data) #{"user": "root123", "passwd": "sheen123", "submit": True,....} if form.validate_on_submit(): user = form.data["user"] passwd = form.data["passwd"] if isPasswdOk(user,passwd): session["user"] = user session["passwd"] = passwd return redirect(url_for("index")) else: return render_template("login.html",form=form,message="密碼或用戶名錯(cuò)誤") else: return render_template("login.html",form=form) @app.route("/register/",methods=["GET","POST"]) def register(): form = RegisterFrom() # 如果是post方法并且表單驗(yàn)證通過的話, 返回True; if form.validate_on_submit(): # 用戶提交的表單信息 print(form.data) return "ok" return render_template("register.html", form=form) @app.route("/logout/") def logout(): session.pop("user", None) session.pop("passwd", None) # 注銷即刪除用戶的session信息, 注銷成功, 跳轉(zhuǎn)到首頁; return redirect(url_for("index")) # return redirect("/") if __name__ == "__main__": app.run( port = 8900) # 報(bào)錯(cuò)1:TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given # 解決:把輸入表單LoginForm,RegisterFrom中的Required去掉 # 問題2:每次重新運(yùn)行程序,都會(huì)顯示root123用戶已登陸,即session里面有數(shù)據(jù) # 解決:添加判別session內(nèi)容的函數(shù)is_login()。
# zaj_models.py,存放數(shù)據(jù)庫操作 import pymysql from zaj_config import DB # 1. 創(chuàng)建連接 conn = pymysql.connect( host=DB.HOST, user = DB.USER, passwd = DB.PASSWD, port = DB.PORT, db = DB.DBNAME, ) cur = conn.cursor() def isUserExist(username): """判斷用戶名是否存在""" sqli = "select * from user where name="%s"" %(username) res = cur.execute(sqli) # res返回的是sql語句查詢結(jié)果的個(gè)數(shù); # 如果為0, 沒有查到。 if res == 0: return False else: return True def isPasswdOk(username, passwd): sqli = "select * from user where name="%s" and passwd="%s"" %( username, passwd) res = cur.execute(sqli) if res == 0 : return False else: return True def addUser(username, passwd): """用戶注冊(cè)時(shí), 添加信息到數(shù)據(jù)庫中""" sqli = "insert into user(name, passwd) values("%s", "%s")" %( username, passwd) try: res = cur.execute(sqli) conn.commit() except Exception as e: conn.rollback() return e # # cur.close() # conn.close() if __name__ == "__main__": addUser("root", "root") print(isUserExist("root")) print(isPasswdOk("root", "root"))
# zaj_forms.py,存放表單操作 from flask_wtf import FlaskForm # 每個(gè)Web表單都由一個(gè)繼承自FlaskForm的類表示 from wtforms import StringField,PasswordField,SubmitField # StringField類表示的是屬性為type="text"的元素。 # SubmitField類表示的是是屬性為type="submit"的元素 #WTForms內(nèi)建的驗(yàn)證函數(shù)validators,而且是以數(shù)組形式,正對(duì)應(yīng)了前面說的一個(gè)字段可以有一個(gè)或者多個(gè)驗(yàn)證函數(shù) from wtforms.validators import Length, Required, EqualTo, Regexp,Email class LoginForm(FlaskForm): user = StringField( label="用戶名", validators=[ Length(5,13) ] ) passwd = PasswordField( label="密碼", validators=[ Length(6,12), ] ) submit = SubmitField( label="登陸" ) class RegisterFrom(FlaskForm): user = StringField( label="用戶名/郵箱/手機(jī)號(hào)", validators=[ Length(5,13) ] ) passwd = PasswordField( label="密碼", validators=[ Length(6,12), ] ) repasswd = PasswordField( label="確認(rèn)密碼", validators=[ EqualTo("passwd",message="密碼不一致!") ] ) phone = StringField( label="電話號(hào)碼", validators=[ Regexp(r"1d{10}", message="手機(jī)號(hào)碼格式錯(cuò)誤") ] ) email = StringField( label="郵箱", validators=[ Email(message="郵箱格式錯(cuò)誤!") ] ) submit = SubmitField( label="注冊(cè)" )
# zaj_config.py , 存放數(shù)據(jù)庫類 class DB: HOST = "localhost" USER= "root" PASSWD = "sheen" PORT = 3306 DBNAME = "zaj_form"
確保數(shù)據(jù)庫zaj_form中已有表user,user有元素name,passwd,添加用戶name= ‘python’ , passwd=’1234567’
主頁:
登陸之后,自動(dòng)跳轉(zhuǎn)主頁,顯示session的緩存。
當(dāng)注冊(cè)表單某一項(xiàng)不滿足程序定義的規(guī)則時(shí)
當(dāng)注冊(cè)成功時(shí),返回"OK"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/44897.html
閱讀 982·2023-04-26 03:03
閱讀 2290·2021-10-12 10:12
閱讀 1285·2021-09-24 09:48
閱讀 1738·2021-09-22 15:25
閱讀 3421·2021-09-22 15:15
閱讀 1011·2019-08-29 16:21
閱讀 1130·2019-08-28 18:00
閱讀 3497·2019-08-26 13:44