日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

flask 检测post是否为空_使用Flask搭建一个校园论坛-4

發(fā)布時(shí)間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flask 检测post是否为空_使用Flask搭建一个校园论坛-4 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一節(jié)中完成了注冊(cè)功能的前期準(zhǔn)備工作,在這一節(jié)內(nèi)容中將完成用戶注冊(cè)、登錄功能。

1.知識(shí)預(yù)覽

在本屆中將學(xué)習(xí)到以下內(nèi)容的知識(shí)

  • 如何使用wtform來(lái)渲染表單
  • 如果使用flask-mail來(lái)發(fā)送郵件
  • 2.用戶注冊(cè)

    在前端中form表單是用的比較多的東西,我們可以使用wtforms這個(gè)框架,直接通過(guò)后端代碼來(lái)渲染前端表單。新建bbs/forms.py文件,嵌入以下代碼

    from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, SelectField, BooleanField, TextAreaField, FileField, Label, HiddenField, PasswordFieldclass BaseUserForm(FlaskForm):user_name = StringField(u'用戶名',validators=[DataRequired(message='用戶名不能為空'),Length(min=1, max=16, message='用戶名長(zhǎng)度限定在1-16位之間'),Regexp('^[a-zA-Z0-9_]*$',message='用戶名只能包含數(shù)字、字母以及下劃線.')],render_kw={'placeholder': '請(qǐng)輸入用戶名長(zhǎng)度1-16之間'})nickname = StringField(u'昵稱',validators=[DataRequired(message='昵稱不能為空'),Length(min=1, max=20, message='昵稱長(zhǎng)度限定在1-20位之間')],render_kw={'placeholder': '請(qǐng)輸入昵稱長(zhǎng)度1-20之間'})user_email = StringField(u'注冊(cè)郵箱',render_kw={'placeholder': '請(qǐng)輸入注冊(cè)郵箱', 'type': 'email'})submit = SubmitField(u'注冊(cè)', render_kw={'class': 'btn btn-success btn-xs'})

    在上面的代碼中,首先導(dǎo)入相關(guān)的庫(kù),然后新建了一個(gè)BaseUserForm的類,因?yàn)橛脩舻男畔⒃诤芏啾韱沃惺褂玫搅?#xff0c;因此可以將共同的屬性剝離出來(lái),然后在不同的場(chǎng)合繼承該基類,并且可以根據(jù)不同的場(chǎng)合在子類中定制我們的表單屬性,這樣就可以降低代碼的冗余量。如果在每個(gè)需要使用到用戶信息的表單代碼中寫(xiě)入同樣的內(nèi)容,那么久顯得代碼很臃腫了。

    BaseUserForm類中使用到了wtforms中的一些屬性,比如StringField就相當(dāng)于是我們前端的input標(biāo)簽,SubmitField就相當(dāng)于是<input type="submit">,具體可以去看wtforms的官方文檔。

    繼續(xù)在上面的文件中嵌入如下代碼,新建注冊(cè)表單類

    class RegisterForm(FlaskForm):user_name = StringField(u'用戶名',validators=[DataRequired(message='用戶名不能為空'),Length(min=1, max=16, message='用戶名長(zhǎng)度限定在1-16位之間'),Regexp('^[a-zA-Z0-9_]*$',message='用戶名只能包含數(shù)字、字母以及下劃線.')],render_kw={'placeholder': '請(qǐng)輸入用戶名長(zhǎng)度1-16之間'})nickname = StringField(u'昵稱',validators=[DataRequired(message='昵稱不能為空'),Length(min=1, max=20, message='昵稱長(zhǎng)度限定在1-16位之間')],render_kw={'placeholder': '請(qǐng)輸入昵稱長(zhǎng)度1-20之間'})user_email = StringField(u'注冊(cè)郵箱',validators=[DataRequired(message='注冊(cè)郵箱不能為空'),Length(min=4, message='注冊(cè)郵箱長(zhǎng)度必須大于4')],render_kw={'placeholder': '請(qǐng)輸入注冊(cè)郵箱', 'type': 'email'})password = StringField(u'密碼',validators=[DataRequired(message='用戶密碼不能為空'),Length(min=8, max=40, message='用戶密碼長(zhǎng)度限定在8-40位之間'),EqualTo('confirm_pwd', message='兩次密碼不一致')],render_kw={'placeholder': '請(qǐng)輸入密碼', 'type': 'password'})confirm_pwd = StringField(u'確認(rèn)密碼',validators=[DataRequired(message='用戶密碼不能為空'),Length(min=8, max=40, message='用戶密碼長(zhǎng)度限定在8-40位之間')],render_kw={'placeholder': '輸入確認(rèn)密碼', 'type': 'password'})colleges = SelectField(u'學(xué)院', choices=[(1, '計(jì)算機(jī)')])submit = SubmitField(u'注冊(cè)', render_kw={'class': 'source-button btn btn-primary btn-xs mt-2'})def __init__(self, *args, **kwargs):super(RegisterForm, self).__init__(*args, **kwargs)cols = College.query.all()self.colleges.choices = [(col.id, col.name) for col in cols]def validate_user_name(self, filed):if User.query.filter_by(username=filed.data).first():raise ValidationError('用戶名已被注冊(cè).')def validate_user_email(self, filed):if User.query.filter_by(email=filed.data.lower()).first():raise ValidationError('郵箱已被注冊(cè).')def validate_nickname(self, filed):if User.query.filter_by(nickname=filed.data).first():raise ValidationError('昵稱已被注冊(cè)')

    因?yàn)閷W(xué)院的選項(xiàng)有許多,我們可以在類的構(gòu)造函數(shù)中通過(guò)數(shù)據(jù)庫(kù)去獲取數(shù)據(jù)庫(kù)中已經(jīng)存在的學(xué)院,然后將其設(shè)置到colleges類屬性的choices值上,這樣當(dāng)我們打開(kāi)頁(yè)面渲染表單時(shí),數(shù)據(jù)就會(huì)自動(dòng)渲染到select標(biāo)簽option上去了,如下圖

    然后還新建了三個(gè)函數(shù)validate_user_name、validate_user_email以及validate_nickname,這三個(gè)函數(shù)主要是用來(lái)判斷email、username、nickname三個(gè)字段的唯一性,因?yàn)樵跀?shù)據(jù)庫(kù)建表的時(shí)候?qū)⑦@三個(gè)字段設(shè)置為unique=True,因此在這里需要做一個(gè)唯一性的判斷。

    使用wtforms時(shí),我們可以通過(guò)validate_加上你需要校驗(yàn)的屬性字段名稱來(lái)檢驗(yàn)前端用戶輸入的數(shù)據(jù)是否符合標(biāo)準(zhǔn)。

    表單類的編寫(xiě)已經(jīng)完成,接下來(lái)就是整個(gè)注冊(cè)邏輯的實(shí)現(xiàn)了。新建bbs/templates/frontend/register.html文件,嵌入以下代碼

    {% extends "frontend/base.html" %} {% import 'bootstrap/wtf.html' as wtf %} {% block title %}用戶注冊(cè) {% endblock %} {% block content %}<body><main><div class="container"><div class="jumbotron pt-5 pb-1 mt-2"><div class="row"><div class="col-md-8"><h3 class="text-muted"><b>歡迎注冊(cè)加入狗子學(xué)院~</b></h3><hr class="bg-primary"><p><b>在這里你可以:</b></p><ul><li>瀏覽當(dāng)下校園的一些趣事、雜談以及誰(shuí)和誰(shuí)的八卦</li><li>發(fā)布一些咸魚(yú)交易、尋物啟事等等</li><li>發(fā)現(xiàn)臭味相投的朋友、開(kāi)拓自己的圈子</li></ul><img src="{{ url_for('static', filename='img/index.jpg') }}" class="rounded img-fluid"></div><div class="col-md-4"><div class="card mb-3 w-100 bg-light"><div class="card-header"><h4 class="text-muted"><strong>用戶注冊(cè)</strong></h4></div><div class="card-body">{% include "_flash.html" %}<form class="bs-component" action="/auth/register/" method="post">{{ form.csrf_token }}{{ wtf.form_field(form.user_name) }}{{ wtf.form_field(form.nickname) }}{{ wtf.form_field(form.user_email) }}{{ wtf.form_field(form.password) }}{{ wtf.form_field(form.confirm_pwd) }}{{ wtf.form_field(form.colleges) }}<label for="captcha">驗(yàn)證碼</label><div class="input-group"><input type="text" class="form-control" name="captcha" id="captcha" placeholder="請(qǐng)輸入驗(yàn)證碼" aria-required="true" aria-describedby="captcha" required><div class="input-group-append"><button class="btn btn-success" onclick="sendCapt()" id="sendCaptcha">發(fā)送</button></div></div><p class="p-hint">驗(yàn)證碼發(fā)送成功,10分鐘內(nèi)有效!</p>{{ form.submit }}<hr><small>已有賬號(hào)? <a style="text-decoration: none;" href="{{ url_for('.login') }}">登錄.</a></small></form></div></div></div></div></div></div></main>

    然后打開(kāi)bbs/blueprint/frontend/auth.py文件,接著在上一節(jié)下面嵌入如下代碼

    @auth_bp.route('/register/', methods=['GET', 'POST']) def register():colleges = College.query.all()form = RegisterForm()return render_template('frontend/register.html', colleges=colleges, form=form)

    在后端代碼中我們通過(guò)render_template函數(shù)返回了前端注冊(cè)頁(yè)面,并且攜帶注冊(cè)表單的實(shí)例參數(shù)。在前端html文件中,我們可以通過(guò)form.參數(shù)名的方式來(lái)進(jìn)行表單渲染。同時(shí)還在前端文件中導(dǎo)入了bootstrap/wtf.html,這樣就可以將表單的樣式渲染成bootstrap的樣式,當(dāng)然也可以不是bootstrap/wtf.html來(lái)渲染,在后端表單類中可以通過(guò)render_kw參數(shù)來(lái)指定我們表單的一些特定參數(shù)。

    在前端頁(yè)面中我們還手動(dòng)加入了一行驗(yàn)證碼輸入框,點(diǎn)擊發(fā)送按鈕就可以將驗(yàn)證碼發(fā)送到用戶填寫(xiě)的郵箱當(dāng)中去了。為什么不將此輸入框?qū)懙胶蠖吮韱沃腥?#xff1f;因?yàn)槟菢硬缓锰幚砬岸藰邮搅恕?/p>

    訪問(wèn)http://127.0.0.1/auth/register/ 將會(huì)看到如下頁(yè)面:

    在注冊(cè)頁(yè)面中是需要用戶填寫(xiě)郵箱收到的驗(yàn)證碼,因此我們需要在后端代碼中實(shí)現(xiàn)發(fā)送郵件的功能。發(fā)送郵件的功能是通過(guò)flask-email來(lái)實(shí)現(xiàn)的,打開(kāi)bbs/extensions.py文件,加入下面的代碼,然后在__init__.py文件中進(jìn)行注冊(cè)。

    from flask_mail import Mail mail = Mail()

    在使用發(fā)送郵件功能之前,首先我們需要到qq郵箱或者網(wǎng)易郵箱或者其他可以使用的郵箱申請(qǐng)SMTP服務(wù),具體流程可以某度某歌搜索一下,這里就不再累述。將申請(qǐng)到的私密信填入到.env文件中

    MAIL_SERVER='smtp.qq.com' MAIL_USERNAME='你的qq郵箱名' MAIL_PASSWORD='qq郵箱秘鑰不是登錄密碼是申請(qǐng)SMTP那串無(wú)規(guī)則秘鑰'

    然后在bbs/setting.py文件中加入下面的代碼

    class BaseConfig(object): # 省略之前代碼BBS_MAIL_SUBJECT_PRE = '[狗子學(xué)院]'MAIL_SERVER = os.getenv('MAIL_SERVER')MAIL_PORT = 465MAIL_USE_SSL = TrueMAIL_USERNAME = os.getenv('MAIL_USERNAME')MAIL_PASSWORD = os.getenv('MAIL_PASSWORD')MAIL_DEFAULT_SENDER = ('BBS Admin', MAIL_USERNAME)

    新建bbs/email.py文件,并將下面代碼寫(xiě)入其中。

    from threading import Threadfrom bbs.extensions import mail from flask_mail import Message from flask import current_app, render_templatedef async_send_mail(app, msg):with app.app_context():mail.send(msg)def send_email(to_mail, subject, template, **kwargs):message = Message(current_app.config['BBS_MAIL_SUBJECT_PRE'] + subject,recipients=[to_mail],sender=current_app.config['MAIL_USERNAME'])message.body = render_template(template + '.txt', **kwargs)message.html = render_template(template + '.html', **kwargs)th = Thread(target=async_send_mail, args=(current_app._get_current_object(), message))th.start()return th

    在send_email函數(shù)中,使用了render_template()來(lái)渲染了郵件消息body以及html參數(shù),因此需要先將這兩個(gè)模板準(zhǔn)備好。新建bbs/templates/email/verifyCode.html 與bbs/templates/email/verifyCode.txt 文件,將下面的代碼寫(xiě)到文件中去

    verifyCode.html

    <h3 style="font-weight: bold;font-size: 18px">Hello {{ username }},</h3> <p>Welcome to join the <a href="http://bbs.2dogz.cn">狗子學(xué)院</a>!This is your register captcha below here.</p> <h1><strong>{{ ver_code }}</strong></h1> <h5><b><i>The captcha will expire after 10 minutes.</i></b></h5> <p style="color: red; font-style: italic"> If this operate is not by yourself, please change your password right now!Maybe your account was cracked.</p> <small>(Please do not reply to this notification, this inbox is not monitored.)</small>

    verifyCode.txt

    Hello {{ username }} Welcome to Blogin! Welcome to join the 狗子學(xué)院!This is your register captcha below here. {{ ver_code }} The captcha will expire after 10 minutes. If this operate is not by yourself, please change your password right now!Maybe your account was cracked.</p>(Please do not reply to this notification, this inbox is not monitored.)

    然后開(kāi)始編寫(xiě)發(fā)送郵件的后端邏輯代碼,新建bbs/blueprint/frontend/normal.py 文件,因?yàn)榘l(fā)送郵件屬于通用行為,因此將其放入normal.py模塊中,將以下代碼嵌入其中

    from flask import Blueprint, send_from_directory, request, jsonify from bbs.extensions import db from bbs.email import send_email from bbs.models import VerifyCode, Gender, Role, College@normal_bp.route('/send-email/', methods=['POST']) def send():to_email = request.form.get('user_email')username = request.form.get('user_name')ver_code = generate_ver_code()send_email(to_mail=to_email, subject='Captcha', template='email/verifyCode', username=username,ver_code=ver_code)# 判斷是否已經(jīng)存在一個(gè)最新的可用的驗(yàn)證碼,以確保生效的驗(yàn)證碼是用戶收到最新郵件中的驗(yàn)證碼exist_code = VerifyCode.query.filter(VerifyCode.who == to_email, VerifyCode.is_work == 1).order_by(VerifyCode.timestamps.desc()).first()if exist_code:exist_code.is_work = Falsent = datetime.datetime.now()et = nt + datetime.timedelta(minutes=10)verify_code = VerifyCode(val=ver_code, who=to_email, expire_time=et)db.session.add(verify_code)db.session.commit()return jsonify({'tag': 1, 'info': '郵件發(fā)送成功!'})

    我們根據(jù)請(qǐng)求中的keyword來(lái)獲取前端發(fā)送過(guò)來(lái)的請(qǐng)求參數(shù),然后調(diào)用send_email()函數(shù)進(jìn)行發(fā)送郵件,同時(shí)將生成的隨機(jī)驗(yàn)證碼放入到郵件消息體中去。

    然后判斷數(shù)據(jù)庫(kù)中是否已經(jīng)存在了屬于該注冊(cè)用戶的驗(yàn)證碼,如果有則將它設(shè)置為過(guò)期的,然后將新的驗(yàn)證碼存入到數(shù)據(jù)庫(kù)中,并設(shè)置過(guò)期時(shí)間為10分鐘。這里是通過(guò)MySQL來(lái)保存的驗(yàn)證碼信息,也有其他方法來(lái)保存驗(yàn)證碼信息,比如使用redis來(lái)保存,redis可以設(shè)置字段過(guò)期時(shí)間,如果達(dá)到了這個(gè)時(shí)間,再去取這個(gè)字段的值就會(huì)為None。

    接著我們來(lái)處理前端發(fā)送郵件的代碼,打開(kāi)bbs/templates/frontend/register.html文件,加入下面的代碼

    <main> ... </main> <script>let time = 60;let reg = /^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/;function sendCapt(){let $sendBtn = $("#sendCaptcha");let $email = $("#user_email");let $username = $("#user_name");if ($username.val() === '' || $email.val() === '' || !reg.test($email.val())){return false;}$sendBtn.attr('disabled', true);getRandomCode($sendBtn);$.ajax({url: '/normal/send-email/',type: 'post',data: {'user_name': $username.val(), 'user_email': $email.val()},success: function (res){if (res.tag){$(".p-hint").slideDown(500).delay(3000).hide(500);}}})}//倒計(jì)時(shí)function getRandomCode(obj) {if (time === 0) {time = 60;obj.text('發(fā)送');obj.attr('disabled', false);return;} else {time--;obj.text(time+'(秒)');}setTimeout(function() {getRandomCode(obj);},1000);}</script>

    通過(guò)ajax向后端/normal/send-email/發(fā)送請(qǐng)求,同時(shí)將email與username傳遞到后端,同時(shí)將發(fā)送驗(yàn)證碼按鈕置為不可點(diǎn)擊狀態(tài),間隔60s才能發(fā)送一次,并在前端頁(yè)面給用戶一個(gè)提示信息。這樣發(fā)送驗(yàn)證碼郵件的整個(gè)流程就完成了,接下里要處理用戶點(diǎn)擊注冊(cè)按鈕之后的邏輯。

    我們使用的是wtfforms來(lái)渲染的后端表單,并且在某些表單字段中加入了一些限制信息。在后端代碼中,我們可以通過(guò)wtfforms的示例來(lái)驗(yàn)證我們的表單,打開(kāi)bbs/blueprint/frontend/auth.py 加入下面的代碼

    @auth_bp.route('/register/', methods=['GET', 'POST']) def register(): ...if form.validate_on_submit():username = form.user_name.datanickname = form.nickname.datapassword = form.confirm_pwd.dataemail = form.user_email.datacollege = form.colleges.datacaptcha = request.form.get('captcha')code = VerifyCode.query.filter(VerifyCode.who == email, VerifyCode.is_work == 1).order_by(VerifyCode.timestamps.desc()).first()if code:if code.val != int(captcha):flash('驗(yàn)證碼錯(cuò)誤!', 'danger')return redirect(request.referrer)elif code.expire_time < datetime.datetime.now():flash('驗(yàn)證碼已過(guò)期!', 'danger')return redirect(request.referrer)else:flash('請(qǐng)先發(fā)送驗(yàn)證碼到郵箱!', 'info')return redirect(request.referrer)user = User(username=username,college_id=college,nickname=nickname,email=email,password=password,status_id=1)user.generate_avatar()user.set_password(password)code.is_work = Falsedb.session.add(user)db.session.commit()flash('注冊(cè)成功,歡迎加入二狗學(xué)院!', 'success')return redirect(url_for('.login'))

    通過(guò)form.validate_on_submit()來(lái)判斷提交的表單是否通過(guò)了驗(yàn)證,通過(guò)驗(yàn)證之后通過(guò)form.字段名.data來(lái)獲取對(duì)應(yīng)表單字段的值,然后根據(jù)郵箱來(lái)查找上一步數(shù)據(jù)庫(kù)保存的驗(yàn)證碼,如果不存在驗(yàn)證碼,則提示用戶發(fā)送驗(yàn)證碼到郵箱,因?yàn)榇嬖谥环N可能用戶亂填一個(gè)驗(yàn)證碼,而不發(fā)送驗(yàn)證碼到郵箱。然后判斷驗(yàn)證碼是否正確或者過(guò)期,如果未通過(guò),則發(fā)送對(duì)應(yīng)的提示消息提示用戶,如果通過(guò),則將用戶信息保存到數(shù)據(jù)庫(kù)中,然后重定向到登錄頁(yè)面。至此,用戶注冊(cè)的功能就已經(jīng)完成了。

    用戶登錄

    相比注冊(cè)功能,用戶登錄就比較簡(jiǎn)單了。新建bbs/templates/frontend/login.html文件,該文件為用戶登錄的前端頁(yè)面模板文件,同樣的我們使用wtfforms來(lái)渲染表單,在文件中嵌入下面的代碼

    {% extends "frontend/base.html" %} {% import 'bootstrap/wtf.html' as wtf %} {% block title %}用戶登錄 {% endblock %} {% block content %}<body><main><div class="container">{% include "_flash.html" %}<div class="jumbotron pt-5 pb-3 mt-5"><div class="row"><div class="col-md-8"><img src="{{ url_for('static', filename='img/index.jpg') }}" class="rounded img-fluid"></div><div class="col-md-4"><div class="card mb-3 w-100 bg-light align-self-center"><div class="card-header"><h4 class="text-muted"><strong>用戶登錄</strong></h4></div><div class="card-body "><form class="bs-component" action="/auth/login/" method="post">{{ form.csrf_token }}{{ wtf.form_field(form.usr_email) }}{{ wtf.form_field(form.password) }}{{ wtf.form_field(form.remember_me) }}{{ form.submit }}<hr><small>沒(méi)有賬號(hào)? <a style="text-decoration: none;" href="{{ url_for('.register') }}">注冊(cè).</a></small></form></div></div></div></div></div></div></main></body> {% endblock %}

    代碼中的form.csrf_token 是一種防止csrf攻擊的手段,關(guān)于csrf攻擊具體可以百度,之后的代碼就跟注冊(cè)模板一樣,通過(guò)wtfforms進(jìn)行表單渲染,因此我們需要新建一個(gè)渲染登錄表單的類,打開(kāi)bbs/forms.py模塊,加入新建登錄表單的代碼,如下所示

    class LoginForm(FlaskForm):usr_email = StringField(u'郵箱/用戶名', validators=[DataRequired(message='用戶名或郵箱不能為空')],render_kw={'placeholder': '請(qǐng)輸入郵箱或用戶名'})password = StringField(u'登錄密碼',validators=[DataRequired(message='登錄密碼不能為空'),Length(min=8, max=40, message='登錄密碼必須在8-40位之間')],render_kw={'type': 'password', 'placeholder': '請(qǐng)輸入用戶密碼'})remember_me = BooleanField(u'記住我')submit = SubmitField(u'登錄', render_kw={'class': 'source-button btn btn-primary btn-xs'})

    接著需要處理后端的登錄視圖函數(shù),打開(kāi)bbs/blueprint/frontend/auth.py模塊,新建一個(gè)視圖函數(shù),代碼如下所示

    from flask_login import current_user, login_user, logout_user @auth_bp.route('/login/', methods=['GET', 'POST']) def login():if current_user.is_authenticated:return redirect(url_for('index_bp.index'))form = LoginForm()if form.validate_on_submit():usr = form.usr_email.datapwd = form.password.datauser = User.query.filter(or_(User.username == usr, User.email == usr.lower())).first()if user is not None and user.status.name == '禁用':flash('您的賬號(hào)處于封禁狀態(tài),禁止登陸!聯(lián)系管理員解除封禁!', 'danger')return redirect(url_for('.login'))if user is not None and user.check_password(pwd):if login_user(user, form.remember_me.data):flash('登錄成功!', 'success')return redirect(url_for('index_bp.index'))elif user is None:flash('無(wú)效的郵箱或用戶名.', 'danger')else:flash('無(wú)效的密碼', 'danger')return render_template('frontend/login.html', form=form)

    關(guān)于登錄邏輯處理,flask有一個(gè)十分流行好用的第三方庫(kù)flask-login,使用該第三庫(kù)我們可以很方便的處理登錄、退出權(quán)限控制等操作。

    首先通過(guò)current_user來(lái)判斷用戶是否已經(jīng)登錄了,如果登錄則返回主頁(yè)面。接著通過(guò)LoginForm示例來(lái)獲取前端登錄頁(yè)面?zhèn)鬟f過(guò)來(lái)的值,從數(shù)據(jù)庫(kù)獲取用戶的相關(guān)信息,首先判斷賬號(hào)是否被禁用了,如果被禁用則彈出提示信息,并返回給前端頁(yè)面。接著判斷用戶密碼是否匹配,如果不匹配則返回登錄頁(yè)面,并提示用戶密碼不匹配,反之則重定向到主頁(yè)。

    這里的登錄成功重定向其實(shí)可以做的更加人性化,當(dāng)用戶進(jìn)入到需要登錄才能操作的頁(yè)面時(shí)候,這時(shí)候會(huì)自動(dòng)跳轉(zhuǎn)到登錄頁(yè)面。如果用戶登錄成功,應(yīng)該是返回前一個(gè)頁(yè)面而不是固定返回主頁(yè)。flask_login的login_required裝飾器重定向到登錄頁(yè)面的時(shí)候會(huì)帶一個(gè)next參數(shù),因此我們可以通過(guò)此參數(shù)來(lái)讓用戶登錄成功之后重定向到上一頁(yè),具體實(shí)現(xiàn)很簡(jiǎn)單,就請(qǐng)讀者自主開(kāi)發(fā)吧!

    這時(shí)候我們打開(kāi)登錄頁(yè)面,可以看到如下頁(yè)面

    到此,用戶登錄注冊(cè)功能就已經(jīng)全部實(shí)現(xiàn)了,下一節(jié)將開(kāi)始講述論壇主頁(yè)的實(shí)現(xiàn)。

    教程中的資源文件可以進(jìn)入我的github倉(cāng)庫(kù)下載源代碼使用

    倉(cāng)庫(kù)連接?github.com

    論壇已經(jīng)基本完成了,我已經(jīng)部署到我的個(gè)人服務(wù)器上去了

    主頁(yè) -二狗學(xué)院?bbs.2dogz.cn

    感興趣的同學(xué)可以關(guān)注我的博客網(wǎng)站哦,會(huì)不定期更新一些程序員相關(guān)的博客哦!

    Home - Blogin?2dogz.cn

    總結(jié)

    以上是生活随笔為你收集整理的flask 检测post是否为空_使用Flask搭建一个校园论坛-4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。