用Python+Flask實戰一個實用的留言板Demo

混雜着工做室圖片網任務,截至今天終於完成了暑假另外一個任務
把考覈任務按照狗書再寫一遍
受益不淺,路途荊棘叢生。。。。這裏主要記錄了增長的功能,更多的能夠看源代碼
代碼
在線預覽html

上傳頭像404

Flask上傳文件
我實現的主要思路就是,上傳文件到服務器,而後讀取文件
固然你能夠用二進制存進數據庫,或者用比較成熟的拓展 Flask-Uploads
主要的步驟之前一篇文章寫了 如何實現圖片上傳API

而後你須要定義訪問路由python

@main.route('/avatar/<filename>')
def get_file(filename):
    return send_from_directory(current_app.config['UPLOAD_FOLDER'],filename)

一開始的UPLOAD_FOLDER沒有定義清楚,加上os.getcwd()獲取當前目錄git

UPLOAD_FOLDER= os.getcwd()+'/app/upload/avatar'

若是用的Jinja2模板,在頭像引用處這樣寫就能夠了
我這裏把頭像地址存到了user數據模型中github

<img class="img-rounded profile-thumbnail" width="180" height="180" src="{{ url_for('main.get_file',filename=user.avatar) }}">

頭像更換刪除原來的圖片

if current_user.avatar:
    try:
        os.remove(os.path.join(current_app.config['UPLOAD_FOLDER'],current_user.avatar))
    except OSError:
        return {"error": u'文件不存在'}

使用forgery_py生成測試數據

開發測試的時候常常須要大量的數據,好比下面的用戶模型
shell運行,輸入下面的代碼便可
python manage.py shell
>>>User.generate_fake()
@staticmethod
    def generate_fake(count=100): #數量100
        from sqlalchemy.exc import IntegrityError
        from random import seed
        import forgery_py  #生成虛擬數據所須要的庫

        seed()
        for i in range(count):
            u = User(username=forgery_py.internet.user_name(True),
                    location=forgery_py.address.city(),
                    about_me=forgery_py.lorem_ipsum.sentence(),
                    password=forgery_py.lorem_ipsum.word())
            db.session.add(u)
            try:
                db.session.commit()
            except IntegrityError:
                db.session.rollback()

用profile協助程序性能優化

前輩博客
啓動方式python manage.py profilesql

@manager.command
def profile(length=25, profile_dir=None):
    from werkzeug.contrib.profiler import ProfilerMiddleware
    app.wsgi_app = ProfilerMiddleware(app.wsgi_app, restrictions=[length],
                                      profile_dir=profile_dir)
    app.run()

定義匿名用戶

定義shell

from flask_login import AnonymousUserMixin
class AnonymousUser(AnonymousUserMixin):
    def __init__(self):
        self.username = '遊客'

login_manager.anonymous_user = AnonymousUser

判斷當前用戶是不是匿名用戶數據庫

current_user.is_anonymous() #bool型
if的時候用current_user.is_anonymous

Jinja模板中flask

{% if current_user.is_authenticated() %}
  Hi {{ current_user.name }}!
{% endif %}

AttributeError: 'User' object has no attribute 'is_active'

User須要繼承UserMixin,並添加一個user_loader
from flask_login import UserMixin

class User(db.Model, UserMixin):
    pass

@login_manager.user_loader
def load_user(userid):
    return User.query.get(int(userid))

使用markdown同步實現markdown

效果

首先在create_app中初始化PageDown
forms輸入部分定義爲PageDownField
from flask_pagedown import PageDown
pagedown = PageDown()
def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    pagedown.init_app(app)
    ...
Jinja2中引入
{% block scripts %}
{{ super() }}
{{ pagedown.include_pagedown() }}
{% endblock %}
模型中爲了安全,防止惡意標籤
首先,markdown() 函數初步把Markdown 文本轉換成HTML
而後,把獲得的結果和容許使用的HTML 標籤列表傳給clean() 函數
clean() 函數刪除全部不在白名單中的標籤
轉換的最後一步由linkify() 函數完成,這個函數由Bleach 提供
把純文本中的URL 轉換成適當的連接
class Post(db.Modle):
    ....
    #處理富文本,將Markdown格式轉換爲Html
    @staticmethod
    def on_changed_body(target, value, oldvalue, initiator):
        allowed_tags = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code',
                        'em', 'i', 'li', 'ol', 'pre', 'strong', 'ul',
                        'h1', 'h2', 'h3', 'p']
        target.body_html = bleach.linkify(bleach.clean(
            markdown(value, output_format='html'),
            tags=allowed_tags, strip=True))

db.event.listen(Post.body, 'set', Post.on_changed_body)#實時監聽

效果

能記住的大概就這些了,其餘的都是很雜的錯誤,無論怎麼說,也是次經歷了

首發於個人博客用Python+Flask實戰一個實用的留言板Demo
參考連接:bestallen的博客安全

相關文章
相關標籤/搜索