最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一個(gè)基于flask的web應(yīng)用誕生 用戶注冊(cè)功能開(kāi)發(fā)(5)

 更新時(shí)間:2017年04月11日 10:26:31   作者:雙魚(yú)座的牛  
一個(gè)基于flask的web應(yīng)用誕生第五篇,這篇文章主要介紹了用戶注冊(cè)功能開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

下面把角色分為兩種,普通用戶和管理員用戶,至少對(duì)于普通用戶來(lái)說(shuō),直接修改DB是不可取的,要有用戶注冊(cè)的功能,下面就開(kāi)始進(jìn)行用戶注冊(cè)的開(kāi)發(fā)。

用戶表

首先要想好用戶注冊(cè)的時(shí)候需要提供什么信息:用戶名、密碼、昵稱(chēng)、郵箱、生日、性別、自我介紹,下面就按照這些信息修改用戶模型:

class User(db.Model):
 __tablename__="users"
 id=db.Column(db.Integer,primary_key=True)
 username=db.Column(db.String(50),unique=True,index=True)
 password=db.Column(db.String(50))
 nickname=db.Column(db.String(50))
 email=db.Column(db.String(100))
 birthday=db.Column(db.DateTime)
 gender=db.Column(db.Integer)
 remark=db.Column(db.String(200))
 role_id=db.Column(db.Integer,db.ForeignKey("roles.id"))

然后使用腳本修改db

python default.py db migrate -m "修改用戶表"

回車(chē)后界面顯示內(nèi)容為:

然后進(jìn)行db差異的改動(dòng)

python default.py db upgrade

這時(shí)看db中的表結(jié)構(gòu):

已經(jīng)修改成功

注冊(cè)界面

然后新建register.html模板,設(shè)置登錄表單:

{% extends "base.html"%}
{% block content %} <!--具體內(nèi)容-->
<div class="container">
 <div class="row"></div>
 <div class="row">

  <div>
   <div class="page-header">
    <h1>歡迎您注冊(cè)</h1>
   </div>
   {% for message in get_flashed_messages() %}
   <div class="alert alert-warning">
    <button type="button" class="close" data-dismiss="alter">&times</button>
    {{message}}
   </div>
   {% endfor %}
   <form method="post">
    <div class="form-group">
    <label for="username">用戶名</label>
    <input type="text" class="form-control" name="username" id="username" placeholder="請(qǐng)輸入用戶名">
    </div>
    <div class="form-group">
    <label for="passworld">密碼</label>
    <input type="password" class="form-control" name="password" id="passworld" placeholder="請(qǐng)輸入密碼">
    </div>
    <div class="form-group">
    <label for="email">昵稱(chēng)</label>
    <input type="email" class="form-control" name="nickname" id="nickname" placeholder="請(qǐng)輸入昵稱(chēng)">
    </div>
    <div class="form-group">
    <label for="birthday">生日</label>
    <input type="date" class="form-control" name="birthday" id="birthday" placeholder="請(qǐng)輸入生日">
    </div>
    <div class="form-group">
    <label >性別</label>
    <label class="form-control">
     <input type="radio" name="gender" value="0" id="gender0"><label for="gender0">男</label>
     <input type="radio" name="gender" value="1" id="gender1"><label for="gender1">女</label>
    </label>
    </div>
    <div class="form-group">
    <label for="email">電子郵箱</label>
    <input type="email" class="form-control" name="email" id="email" placeholder="請(qǐng)輸入電子郵箱">
    </div>
    <button type="submit" class="btn btn-default">登錄</button>
   </form>
  </div>
 </div>
</div>
{% endblock %}

然后在default.py文件中新增register路由,代碼為:

@app.route("/register",methods=["GET"])
def register():
 return render_template("/register.html")

運(yùn)行界面正常,然后增加post路由:

@app.route("/register",methods=["Post"])
def registerPost():
 user=User();
 user.username=request.form.get("username","")
 user.password = request.form.get("password", "")
 user.birthday = request.form.get("birthday", "")
 user.email = request.form.get("email", "")
 user.gender = request.form.get("gender", "")
 user.nickname = request.form.get("nickname", "")
 user.role_id = 1 #暫時(shí)約定公開(kāi)用戶角色為1

 #判斷,其中用戶名,密碼,昵稱(chēng)不能為空
 if(len(user.username.strip())==0):
  flash("用戶名不能為空")
  return render_template("/register.html")
 if(len(user.password.strip())==0):
  flash("用戶密碼不能為空")
  return render_template("/register.html")
 if (len(user.nickname.strip()) == 0):
  flash("用戶昵稱(chēng)不能為空")
  return render_template("/register.html")
 db.session.add(user);
 flash("您已注冊(cè)成功")
 return render_template("/register.html")

代碼有點(diǎn)啰嗦,不漂亮,但基本意圖能表達(dá)清楚,功能也可以實(shí)現(xiàn),但現(xiàn)在的問(wèn)題來(lái)了,加入我新增一個(gè)字段,那么需要修改三處代碼(html,form.get,校驗(yàn)),并且尤其是需要修改html,而且html部分沒(méi)有驗(yàn)證,如果增加客戶端驗(yàn)證的話,需要修改的會(huì)更多。那么有沒(méi)有一個(gè)針對(duì)表單進(jìn)行優(yōu)化的工具呢,答案是當(dāng)然有,輪到wtf登場(chǎng)了。

引入WTF表單框架

和之前一樣,首先需要安裝插件。

pip3.6 install flask-wtf

然后引入所需的包

from flask.ext.wtf import Form
from wtforms import StringField,PasswordField,SubmitField,RadioField
from wtforms.validators import DataRequired,EqualTo,Length

下面創(chuàng)建一個(gè)表單RegisterForm:

class RegisterForm(Form):
 username = StringField("請(qǐng)輸入用戶名", validators=[DataRequired()])
 password = PasswordField("請(qǐng)輸入密碼", validators=[DataRequired()])
 repassword=PasswordField("確認(rèn)密碼", validators=[EqualTo("password")])
 nickname= StringField("昵稱(chēng)")
 birthday= DateField("出生日期")
 email= StringField("郵箱地址", validators=[Email()])
 gender= RadioField("性別", choices=[("0", "男"), ("1", "女")], default=0)
 remark= TextAreaField("自我簡(jiǎn)介")
 submit=SubmitField("提交")

修改register.html模板:

{% extends "base.html"%}
{% block content %} <!--具體內(nèi)容-->
{% import "bootstrap/wtf.html" as wtf %} <!--導(dǎo)入bootstrap模板 -->
<div class="container">
 <div class="row"></div>
 <div class="row">

  <div>
   <div class="page-header">
    <h1>歡迎您注冊(cè)</h1>
   </div>
   {% for message in get_flashed_messages() %}
   <div class="alert alert-warning">
    <button type="button" class="close" data-dismiss="alter">&times</button>
    {{message}}
   </div>
   {% endfor %}
   {{ wtf.quick_form(form)}} <!--創(chuàng)建表單-->
  </div>
 </div>
</div>
{% endblock %}

執(zhí)行,輸出結(jié)果:

阿歐,報(bào)錯(cuò)了,看看輸出是什么錯(cuò)誤:

注意紅線一句,是CSRF錯(cuò)誤,CSRF的概念可直接百度,知道問(wèn)題了,其實(shí)也很好修改,在框架中增加一個(gè)秘鑰就可以有效的防范了,在default.py中增加一行:

app.config['SECRET_KEY'] = "Niu_blog String"

秘鑰字符串可自定義

然后再次運(yùn)行,出現(xiàn)界面:

并且包含驗(yàn)證bootstrap的驗(yàn)證樣式,接下來(lái)繼續(xù)改造default.py已完成此注冊(cè)功能

@app.route("/register",methods=["GET","POST"])
def register():
 form=RegisterForm()
 if form.validate_on_submit():
  user=User()
  user.username=form.username.data
  user.password=form.password.data
  user.birthday=form.birthday.data
  user.email=form.email.data
  user.gender=form.gender.data
  user.nickname=form.nickname.data
  user.role_id=1   #暫時(shí)約定公開(kāi)用戶角色為1
  db.session.add(user)
 return render_template("/register.html",form=form)

注意此時(shí)已刪除registerPost方法

好運(yùn)行測(cè)試一下

點(diǎn)擊提交:

阿歐,日期格式為啥不對(duì)?這個(gè)要從源碼里看了:

class DateField(DateTimeField):
 """
 Same as DateTimeField, except stores a `datetime.date`.
 """
 def __init__(self, label=None, validators=None, format='%Y-%m-%d', **kwargs):
  super(DateField, self).__init__(label, validators, format, **kwargs)

 def process_formdata(self, valuelist):
  if valuelist:
   date_str = ' '.join(valuelist)
   try:
    self.data = datetime.datetime.strptime(date_str, self.format).date()
   except ValueError:
    self.data = None
    raise ValueError(self.gettext('Not a valid date value'))

這個(gè)是wtforms的field的源碼,位于/wtforms/fields/core.py的745行,可以看到,這里支持的日期格式為年-月-日格式,格式限定比較死,并且文本框沒(méi)有用html5的date而是普通的text,解決辦法以后再說(shuō),暫時(shí)先修改輸入,改為1988-2-5,然后點(diǎn)擊提交:


注意,由于代碼中提交成功之后依然是返回到此頁(yè),并注入內(nèi)容,所以顯示沒(méi)有問(wèn)題,看看db中:

記錄正常進(jìn)入db,功能實(shí)現(xiàn)完成。

改善登錄頁(yè)

下面改造登錄頁(yè),首先創(chuàng)建登錄表單:

class LoginForm(Form):
 username=StringField("請(qǐng)輸入用戶名",validators=[DataRequired()])
 password=PasswordField("請(qǐng)輸入密碼")
 submit=SubmitField("登錄")

修改登錄模板頁(yè):

{% extends "base.html"%}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %} <!--具體內(nèi)容-->
<div class="container">
 <div class="row"></div>
 <div class="row">

  <div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3">
   <div class="page-header">
    <h1>歡迎您登陸</h1>
   </div>
   {% for message in get_flashed_messages() %}
   <div class="alert alert-warning">
    <button type="button" class="close" data-dismiss="alter">&times</button>
    {{message}}
   </div>
   {% endfor %}
   {{ wtf.quick_form(form)}}
  </div>
 </div>
</div>
{% endblock %}

修改路由方法:

@app.route("/login",methods=["GET","POST"])
def login():
 form=LoginForm()
 if form.validate_on_submit():
  username = form.username.data
  password = form.password.data
  user = User.query.filter_by(username=username, password=password).first()
  if user is not None:
   session["user"] = username
   return render_template("/index.html", name=username, site_name='myblog')
  else:
   flash("您輸入的用戶名或密碼錯(cuò)誤")
   return render_template("/login.html",form=form) # 返回的仍為登錄頁(yè)
 return render_template("/login.html",form=form)

重啟服務(wù),運(yùn)行程序,輸入zhangji和123后,成功登錄首頁(yè)

回到首頁(yè)

現(xiàn)在首頁(yè)白茫茫的一片,什么內(nèi)容都沒(méi)有,正常的輕博客應(yīng)該登錄后顯示發(fā)博按鈕,已關(guān)注文章等,但首先要記錄登錄的狀態(tài),這些將在下一章說(shuō)明。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Python?http.server模塊共享文件的方法詳解

    使用Python?http.server模塊共享文件的方法詳解

    大家好,今天給大家介紹一下Python標(biāo)準(zhǔn)庫(kù)中的http.server模塊,這個(gè)模塊提供了一種簡(jiǎn)單的方式來(lái)快速啟動(dòng)一個(gè)HTTP服務(wù)器,文中給大家介紹了使用Python?http.server模塊共享文件的方法,需要的朋友可以參考下
    2024-05-05
  • python實(shí)現(xiàn)發(fā)送郵件功能

    python實(shí)現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)發(fā)送郵件功能,使用的模塊是smtplib、MIMEText,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • python中如何使用正則表達(dá)式的集合字符示例

    python中如何使用正則表達(dá)式的集合字符示例

    我們都知道,正則表達(dá)式可以很方便地對(duì)字符串進(jìn)行匹配、查找、分割等操作,下面這篇文章主要給大家介紹了關(guān)于python中如何使用正則表達(dá)式的集合字符的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-10-10
  • Python找出列表中出現(xiàn)次數(shù)最多的元素三種方式

    Python找出列表中出現(xiàn)次數(shù)最多的元素三種方式

    本文通過(guò)三種方式給大家介紹Python找出列表中出現(xiàn)次數(shù)最多的元素,每種方式通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下
    2020-02-02
  • Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用

    Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用

    本文主要介紹了Django博客系統(tǒng)注冊(cè)之創(chuàng)建用戶模塊應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python利用Matplotlib繪圖無(wú)法顯示中文字體的解決方案

    Python利用Matplotlib繪圖無(wú)法顯示中文字體的解決方案

    在很長(zhǎng)一段時(shí)間里用Python繪圖,matplotlib都不能很好的顯示中文,下面這篇文章主要給大家介紹了關(guān)于Python利用Matplotlib繪圖無(wú)法顯示中文字體的解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • python利用logging模塊實(shí)現(xiàn)根據(jù)日志級(jí)別打印不同顏色日志的代碼案例

    python利用logging模塊實(shí)現(xiàn)根據(jù)日志級(jí)別打印不同顏色日志的代碼案例

    這篇文章主要介紹了python利用logging模塊實(shí)現(xiàn)根據(jù)日志級(jí)別打印不同顏色日志,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Python-Seaborn熱圖繪制的實(shí)現(xiàn)方法

    Python-Seaborn熱圖繪制的實(shí)現(xiàn)方法

    這篇文章主要介紹了Python-Seaborn熱圖繪制的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python3爬蟲(chóng)帶上cookie的實(shí)例代碼

    Python3爬蟲(chóng)帶上cookie的實(shí)例代碼

    在本篇文章里小編給各位分享的是一篇關(guān)于Python3爬蟲(chóng)帶上cookie的實(shí)例代碼內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • Python Django項(xiàng)目和應(yīng)用的創(chuàng)建詳解

    Python Django項(xiàng)目和應(yīng)用的創(chuàng)建詳解

    這篇文章主要為大家介紹了Python Django項(xiàng)目和應(yīng)用的創(chuàng)建,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11

最新評(píng)論

九寨沟县| 黄平县| 鄂伦春自治旗| 赤水市| 新泰市| 孝昌县| 无棣县| 阿坝县| 远安县| 桑植县| 天气| 鲁山县| 兴安县| 万载县| 定陶县| 永济市| 门源| 会理县| 肃宁县| 天等县| 乌海市| 尼玛县| 平昌县| 浪卡子县| 萍乡市| 本溪| 志丹县| 封丘县| 和硕县| 宜兴市| 阳东县| 湘潭县| 黑河市| 开原市| 丰城市| 衡阳县| 鄢陵县| 鹤壁市| 沂源县| 铜川市| 湟源县|