资讯专栏INFORMATION COLUMN

用Python+Flask实战一个实用的留言板Demo

klinson / 1972人阅读

摘要:混杂着工作室图片网任务截至今天终于完成了暑假另一个任务把考核任务按照狗书再写一遍受益匪浅,路途荆棘丛生。。。。

混杂着工作室图片网任务,截至今天终于完成了暑假另一个任务
把考核任务按照狗书再写一遍
受益匪浅,路途荆棘丛生。。。。这里主要记录了增加的功能,更多的可以看源代码
代码
在线预览

上传头像404
Flask上传文件
我实现的主要思路就是,上传文件到服务器,然后读取文件
当然你可以用二进制存进数据库,或者用比较成熟的拓展Flask-Uploads
主要的步骤以前一篇文章写了 如何实现图片上传API

然后你需要定义访问路由

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

一开始的UPLOAD_FOLDER没有定义清楚,加上os.getcwd()获取当前目录

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

如果用的Jinja2模板,在头像引用处这样写就可以了
我这里把头像地址存到了user数据模型中

头像更换删除原来的图片
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 profile

@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()    
定义匿名用户

定义

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模板中

{% 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的博客

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40999.html

相关文章

  • Python3网络爬虫实战---6、Web库安装:Flask、Tornado

    摘要:在本书中用到的一些服务程序主要有。本节来分别介绍它们的安装方法。的安装是一个轻量级的服务程序,简单易用灵活,在本书中我们主要用它来做一些服务,本节我们来了解下它的安装方式。相关链接官方文档安装执行完毕之后即可完成安装。 上一篇文章:Python3网络爬虫实战---5、存储库的安装:PyMySQL、PyMongo、RedisPy、RedisDump下一篇文章:Python3网络爬虫实战-...

    yeyan1996 评论0 收藏0
  • Flask Web 开发实战笔记

    摘要:开发实战笔记安装和使用虚拟环境虚拟环境是解释器的一个私有副本,在这个环境中你可以安装私有的包,而且不会影响系统中安装的全局的解释器。处理和函数之间关系的程序称为路由。例如在请求开始时,我们需要创建数据库连接或认证发起请求的用户。 几天前和同事一起喝酒,大家谈到为什么开始读书这件事。这里所说的读书不是专业的书籍,而是一些闲书。结果发现原来我们开始读书的原因很功利。都是因为生活中遇到了困...

    罗志环 评论0 收藏0
  • 极客爱情: 情人节礼物大作战

    摘要:故而总结如下编成的代码浪漫的环境亲手制作的礼物注意请将下面的程序员的情人节礼物换成语言。言归正传程序员的情人节礼物入门之材料构思情人节礼物之设备展示想着在这个移动盛行的时代,再用电脑就不太合适了。 是时候应该反击了 当我看到@鄢得諼草 的那几篇黑我黑到体无完肤的#极客爱情# @Phodal 故事的时候,我发现我竟无言以对。或许,作为一名程序员,我们或多或少都有这样的共性。 ...

    XGBCCC 评论0 收藏0
  • 蠎周刊 2015 年度最赞

    摘要:蠎周刊年度最赞亲俺们又来回顾又一个伟大的年份儿包去年最受欢迎的文章和项目如果你错过了几期就这一期不会丢失最好的嗯哼还为你和你的准备了一批纪念裇从这儿获取任何时候如果想分享好物给大家在这儿提交喜欢我们收集的任何意见建议通过来吧原文 Title: 蠎周刊 2015 年度最赞Date: 2016-01-09 Tags: Weekly,Pycoder,Zh Slug: issue-198-to...

    young.li 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<