flask網頁建設主題

新增user.html顯示使用者資料

Steven Wang
Nov 15, 2020

(1)templates folder / user.html

(2)route.py / def user(username)
將資料傳到user.html

(3)__init__.py 新增url
app.add_url_rule(‘/<username>’, ‘profile’, user) 網址後面直接username

網址後面直接username的效果,能透過網址查詢資料

(4)查詢到不存在的username會報錯如下

要對route.py / def user(username)做一個判斷
如果取無值返回錯誤

(5)返回404錯誤

from flask import abort

效果

(6)登入才可以訪問 @login_required

(7) 承(5)建立404模板

(7–1) templates/404.html

(7–2) route.py / def page_not_found方法 (參數e)

def page_not_found(e):
return render_template('404.html'),404 / 加404

(7–3) __init__.py / page_not_found方法 需要註冊app.register_error_handler(404, page_not_found)

(8)建立user profile入口

效果為連結進入user的入口

設定頭像

(1)註冊一個email指定頭像,有支援Gravatar的網頁會顯示出全球一致的頭像

(2)python command
from hashlib import md5
md5(‘steven.wang@pocs.com.tw’.encode(‘utf-8’)).hexdigest() /計算出識別郵件的hash值

https://www.gravatar.com/avatar/ 將hash值結合進去網址

https://www.gravatar.com/avatar/a07dc9b4234b327c3d8aef82537e730f

設置圖像大小?s=200
https://www.gravatar.com/avatar/a07dc9b4234b327c3d8aef82537e730f?s=200

未註冊的email會顯示預設的頭像 (大家都一樣),為了不一樣?d=identicon
https://www.gravatar.com/avatar/a07dc9b4234b327c3d8aef82537e730f?s=200&d=identicon

在瀏覽輸入可查看頭像

(3)動態製作生成頭像 models/class User / def avatar

根據user email動態生成def avatar(self, size=80):
md5_digest = md5(self.email.lower().encode('utf-8')).hexdigest()
return 'https://www.gravatar.com/avatar/{}?d=identicon&s={}'.format(md5_digest, size)

(4)更改user.html顯示頭像及posts

成果

新增Models / User兩個欄位about_me , create_time

變更需要做migrate

migrate之後需要做upgrade

重新創建用戶 刪除再創建

>>> from twittor import db, create_app
>>> from twittor.models import User
>>> app=create_app()
>>> app.app_context().push()

刪除

>>> u = User.query.get(2)
>>> db.session.delete(u)
>>> db.session.commit()

新增

>>> u=User(username=”demo”, email=”demo@demo.com”, about_me=”Hi, I’m demo, I like flask”)
>>> u.set_password(‘demo’)
>>> db.session.add(u)
>>> db.session.commit()

templates/user.html 顯示about_me, create_time

成果

修改Models / User兩個欄位about_me , create_time

(1)創建forms.py/ class EditProfileForm

from wtforms import TextAreaField
from wtforms.validators import Length

class EditProfileForm(FlaskForm)
about_me = TextAreaField(‘About me’, validators=[Length(min=1, max=120)]
submit = SubmitField(‘Save’)

(2)創建templates/edit_profile.html

(3)route.py/def edit_profit()

from twittor.forms import EditProfileForm

if request.method == 'GET':
form.about_me.data = current_user.about_me /顯示原資料

@login_required

if form.validate_on_submit():
current_user.about.me = form.about_me.data /寫入欄位資料 db.session.commit() /寫入資料庫
return redirect(url_for('profile', username=current_user.username))/轉向至user資料,帶username=current_user.username參數

(4)__init__.py內註冊

登入之後 輸入edit_profit在網址後面
http://127.0.0.1:5000/edit_profile
成果

但是會有登入的帳號去改別人profile的問題
{% if user == current_user %} 才顯示edit_profile的連結

--

--