混雜着工做室圖片網任務,截至今天終於完成了暑假另外一個任務
把考覈任務按照狗書再寫一遍
受益不淺,路途荊棘叢生。。。。這裏主要記錄了增長的功能,更多的能夠看源代碼
代碼
在線預覽html
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'文件不存在'}
開發測試的時候常常須要大量的數據,好比下面的用戶模型
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()
前輩博客
啓動方式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 %}
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))
首先在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的博客安全