flask網頁建設主題
新增user.html顯示使用者資料
(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的連結