成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python大佬養(yǎng)成計劃----flask_bootstrap裝飾網(wǎng)頁

_Zhao / 2695人閱讀

摘要:并且只有數(shù)據(jù)庫中存在用戶可以登陸網(wǎng)頁。目前,對于用戶注冊,不返回數(shù)據(jù)庫。用戶注冊時,添加信息到數(shù)據(jù)庫中存放表單操作每個表單都由一個繼承自的類表示類表示的是屬性為的元素。當注冊表單某一項不滿足程序定義的規(guī)則時當注冊成功時,返回

flask_bootstrap
Bootstrap 是 Twitter 開發(fā)的一個開源框架,它提供的用戶界面組件可用于創(chuàng)建整潔且具有吸引力的網(wǎng)頁,而且這些網(wǎng)頁還能兼容所有現(xiàn)代 Web 瀏覽器.

Bootstrap 是客戶端框架,因此不會直接涉及服務(wù)器。服務(wù)器需要做的只是提供引用了 Bootstrap 層疊樣式表(CSS)和 JavaScript 文件的 HTML 響應(yīng), 并且 HTML、CSS 和 JavaScript 代碼中實例化所需組件。這些操作最理想的執(zhí)行場所就是模版。

Flask-Bootstrap 可以在程序中集成 Bootstrap

安裝:

pip install flask-bootstrap

使用:

from flask_bootstrap import Bootstrap
......
bootstrap = Bootstrap(app)
html文件的繼承

初始化 Flask-Bootstrap 之后,就可以在程序中使用一個包含所有Bootstrap 文件的基模版。這個模版利用 Jinja2 的模版繼承機制,讓程序擴展一個具有基本頁面結(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 文件的基模版,編寫適用于自己項目的基模板。

{#自己編寫一個基類模板#}
{% 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,從而實現(xiàn)模版繼承。Flask-Bootstrap 中的基模版提供了一個網(wǎng)頁框架,引入了 Bootstrap 中的所有 CSS 和 JavaScript 文件。

上面這個示例重新定義了3個塊,分別是對 bootstrap/base.html的styles、navbar和content的改寫。這些塊都是基模版提供的,可在衍生模版中重新定義。

如果程序需要向已經(jīng)有內(nèi)容的塊中添加新內(nèi)容, 必須使用 Jinja2 提供的 super() 函數(shù)。例如,如果要在衍生模版中添加新的 CSS 文件,需要這么定義:

{% block styles %}
{{ super() }}
    
{% endblock %}
使flask_bootstrap和flask_wtf編寫一個FLASK項目

要求:

實現(xiàn)網(wǎng)頁主頁顯示、登陸頁面顯示、注冊頁面顯示、用戶退出(注銷)。并且只有數(shù)據(jù)庫中存在用戶可以登陸網(wǎng)頁。主要通過表單來實現(xiàn)數(shù)據(jù)交互。目前,對于用戶注冊,不返回數(shù)據(jù)庫。

實現(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兩個key值;
        # 主函數(shù)代碼里面, 如果注銷, session刪除user, passwd兩個key值;
        # 如果沒有登陸成功, 則跳轉(zhuǎn)到登陸界面
        if "user" not in session:
            return  redirect("/login/")
        # 如果用戶是登陸狀態(tài), 則訪問哪個路由, 就執(zhí)行哪個路由對應(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="密碼或用戶名錯誤")
    else:
        return render_template("login.html",form=form)
@app.route("/register/",methods=["GET","POST"])
def register():
    form = RegisterFrom()
    # 如果是post方法并且表單驗證通過的話, 返回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)
# 報錯1:TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given
# 解決:把輸入表單LoginForm,RegisterFrom中的Required去掉

# 問題2:每次重新運行程序,都會顯示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é)果的個數(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):
    """用戶注冊時, 添加信息到數(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
# 每個Web表單都由一個繼承自FlaskForm的類表示
from wtforms import StringField,PasswordField,SubmitField
# StringField類表示的是屬性為type="text"的元素。
# SubmitField類表示的是是屬性為type="submit"的元素

#WTForms內(nèi)建的驗證函數(shù)validators,而且是以數(shù)組形式,正對應(yīng)了前面說的一個字段可以有一個或者多個驗證函數(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="用戶名/郵箱/手機號",
        validators=[
            Length(5,13)
        ]
    )
    passwd = PasswordField(
        label="密碼",
        validators=[
            Length(6,12),
        ]
    )
    repasswd = PasswordField(
        label="確認密碼",
        validators=[
            EqualTo("passwd",message="密碼不一致!")
        ]
    )
    phone = StringField(
        label="電話號碼",
        validators=[
            Regexp(r"1d{10}", message="手機號碼格式錯誤")
        ]
    )
    email = StringField(
        label="郵箱",
        validators=[
            Email(message="郵箱格式錯誤!")
        ]
    )
    submit = SubmitField(
        label="注冊"
    )
# 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’
主頁:

登陸之后,自動跳轉(zhuǎn)主頁,顯示session的緩存。

當注冊表單某一項不滿足程序定義的規(guī)則時

當注冊成功時,返回"OK"

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44897.html

相關(guān)文章

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<