
flask web开发
文章平均质量分 86
本专栏是参照Miguel Grinberg的Flask Web开发一书, 学习总结本书的知识点并解决在开发过程中遇到的问题。
sjk1996
好好学习
展开
-
16 把flask python web程序部署到heroku平台上
一. 安装git&sudo apt-get install git二. 把完整的web程序放到一个新目录里面比如说我已经有一个完整的web应用, 它里面有这些文件:然后创建一个Heroku_pro文件夹, 把上面所有的文件都放进去, 放进去以后检查一下:三. 在Heroku_pro目录下生成一个git仓库这时你会发现目录下多了一个.git:四. 把当前目录下的所有文件托管到本地git仓库五...原创 2018-06-29 16:53:12 · 925 阅读 · 0 评论 -
15.1 获取代码覆盖报告
编写单元测试有两个目的: 实现新功能时, 单元测试能够确保新添加的代码按预期方式运行。 每次修改程序后, 运行单元测试能保证现有代码的功能没有退化。编写测试组件很重要, 但知道测试的好坏更重要。 代码覆盖工具用来统计单元测试检查了多少程序功能, 并提供一个详细的报告, 说明程序的哪些代码没有测试到。 这个信息非常重要, 因为它能指引你为最需要测试的部分编写测试。一. 安装代码覆盖工具cover...原创 2018-06-15 16:26:26 · 368 阅读 · 0 评论 -
14 使用Flask提供REST Web服务
一. 创建API蓝本 REST API相关的路由是一个自成一体的程序子集, 所以为了更好的组织代码, 我们最好把这些路由放到独立的蓝本中。1)API蓝本的结构|-flasky |-app/ |-api_1_0 |-__init__.py |-users.py |-posts.py |-comments.py |-authenticatio...原创 2018-06-14 16:35:52 · 1551 阅读 · 0 评论 -
13.2 管理评论
本节我们为Web程序实现管理评论的功能。我们的大体思路如下:如果登录的用户有管理评论的权限, 在导航栏添加一个管理评论的导航。点击导航, 路由函数moderate进行处理, 返回moderate.html页面页面内容包括标题, 评论, 页面导航。并且在_comments.html里为每条评论添加两个标签enable和disable控制评论的显示与否。由路由moderate_enable和moder...原创 2018-05-09 20:00:51 · 772 阅读 · 0 评论 -
13.1 显示和提交评论
本节我们要为Web程序添加显示和提交评论的功能。一. 创建Comment表 评论存在数据库中,因此我们要创建一个Comment表来存储评论:class Comment(db.Model): __tablename__ = 'comments' id = db.Column(db.Integer, primary_key=True) body = db.Colu...原创 2018-05-09 16:05:37 · 642 阅读 · 0 评论 -
12.3 在首页显示所关注用户的文章
一. 我们想添加的功能 之前我们完成了用户之间的相互关注, 我们想在首页增加一个选项如下图: 如果已登录用户访问主页, 我们给两个选项卡, 点击All选项, 显示数据库中所有的文章; 点击Followers选项卡, 显示当前用户所关注的用户的文章和自己的文章。 那我们如何实现上述功能? 答案是我们借助cookie(ps:http://blog.csdn.ne...原创 2018-04-25 20:09:28 · 511 阅读 · 0 评论 -
12.2 在资料页中显示关注者
一. 修改|-app/templates/user.html 我们想在用户资料页面增加几个栏目如下: 对应的功能举例说明如下: 如果已登录的用户A(有关注权限的话)访问别的用户B的页面: 如果A未关注B, 显示一个Follow按钮, 点击关注B, 如果A已经关注B, 显示一个Unfollow按钮, 点击取消关注B; ...原创 2018-04-24 17:29:26 · 281 阅读 · 0 评论 -
12.1 高级多对多关系
一. 一对多关系 我们前面讲了两个一对多关系:角色和它所对应的用户, 用户和它所对应的文章, 在一对多关系中, 我们在‘一’的这边设置db.relationship, 在‘多’的一边设置一个外键。二. 多对多关系 而数据库除了一对多关系之外还有多对多关系。最常见的是学生选课这个多对多关系, 一个学生可以选择多门课程, 一门课程也可以被多个学生选择, 如果我们在学生这边添加外键显然行不通...原创 2018-04-22 15:53:25 · 552 阅读 · 0 评论 -
11.6 博客文章编辑器
本节我们为Web程序添加编辑文章的功能。一. 修改|-app/-main/views.py@main.route('edit/<int:id>')@login_requireddef edit(id): post = Post.query.get_or_404(id) if current_user != post.author and not cu...原创 2018-04-19 16:22:32 · 339 阅读 · 0 评论 -
11.5 为博客添加固定链接
我们有时候希望和朋友分享自己的博客, 所以我们要为每一个博客添加一个唯一的链接以供分享使用。一. 修改|-app/-main/views.py@main.route('/post/<int:id>')def post(id): post = Post.query.get_or_404(id) return render_template('post.html', po...原创 2018-04-18 22:26:29 · 709 阅读 · 0 评论 -
11.5 在服务器上处理富文本
上节我们讲到使用Flask-PageDown, 把wtf表单中的PageDownField字段中输入的的markdown文本转换成html预览显示在字段下方, 但是我们点击提交按钮时提交的是在表单中填写的markdown文本, 而不是html文本, 所以我们就得想办法把用户提交的markdown文本转换为html文本保存在数据库中。一. 修改|-app/models.pyfrom mark...原创 2018-04-18 22:08:33 · 427 阅读 · 0 评论 -
11.4 使用Flask-PageDown支持富文本文章
我们编辑长文章的时候, 单一的文本格式便满足不了要求, 于是我们使用PageDown,PageDown的作用是使用javascript实现客户端markdown到html的程序转换。 Flask-PageDown把PageDown集成到wtf表单中, 换言之就是使用javascript把wtf中的markdown转换成html。一. 安装扩展flask-pagedown, markd...原创 2018-04-18 20:33:07 · 1493 阅读 · 0 评论 -
11.3 如何为我们的博客列表增加分页导航
一. 修改|-app/-main/views.py 我们之前访问主页路由时, 会返回数据库中所有的文章, 这样显得页面很庞大复杂, 于是我们对文章进行分页显示。@main.route('/', methods=['GET', 'POST'])def index(): form = PostForm() #... page = request.args.get('...原创 2018-04-14 17:11:08 · 243 阅读 · 0 评论 -
11.2 如何在Web程序开发的过程中创建大量虚拟数据库记录
一. 安装forgerypy包&pip install forgerypy二. 修改|-app/models.py1. 修改User表class User(UserMixin, db.Model): #... @staticmethod def generate_fake(count=100): import forgery_py ...原创 2018-04-13 21:32:45 · 343 阅读 · 0 评论 -
11.1 为博客添加显示和提交文章的功能
一. 修改|-app/models.py Web程序的所有用户的文章存储在数据库里, 每一篇文章就是数据库中的一条记录, 包括文章主体,发布时间, 作者的id等属性。class Post(db.Model): __tablename = 'posts' id = db.Column(db.Integer, primary_key=True) body = db.Co...原创 2018-04-13 21:12:38 · 845 阅读 · 0 评论 -
10.4 用户头像
通过显示用户头像, 我们可以进一步改进资料页面的外观。一. 修改|-app/modelsclass User(UserMixin, db.Model): avatar_hash = db.Column(db.String(32)) #1 def __init__(self, **kwargs): super(User, self).__init__(...原创 2018-04-10 21:35:47 · 271 阅读 · 0 评论 -
10.3 设计管理员资料编辑页面
一. 编写表单类——|-app/-main/forms.pyclass EditProfileAdminForm(FlaskForm): #首先创建表单字段, 管理员可以修改任何用户的任何属性 email = StringField('Email', validators=[DataRequired(), Length(1, 64), Email()]) userna...原创 2018-04-08 15:58:22 · 629 阅读 · 0 评论 -
10.2 设计用户编辑资料页面
我们应该给用户提供编辑自己资料的功能。我们来梳理一下如何实现这个功能, 首先我们应该建立一个修改用户资料的表单, 有了这个表单以后就得有一个路由来返回该表单, 如果是get请求则直接返回渲染该表单的模板; post请求修改资料, 并且返回用户资料页面;最后在用户资料页面添加一个修改资料的了解即可。一. 添加表单|-app/-main/forms.pyfrom flask_wtf import Fl...原创 2018-03-26 11:13:31 · 3958 阅读 · 0 评论 -
10.1 编写用户页面
我们访问不同用户的页面, 显示不同的信息, 但是用户页面的大体架构都是相同的, 这是怎么做到的呢?其实我们只要编写一个用户页面user.html, 然后返回模板的时候把当前登录的用户current_user作为参数传进模板, 模板就会显示该用户的各个属性, 不同用户的属性不同, 显示的内容也就不尽相同了。一. 为User表增加属性#为了使用户资料更丰富一些, 我们为用户增加几个属性:from fl...原创 2018-03-24 21:21:57 · 407 阅读 · 0 评论 -
9.2 角色验证——根据权限访问视图函数
我们的web程序用户有不同的角色——普通用户, 管理评论的人, 权限最高的管理员。 不同的权限可以浏览不同的页面, 权限越大, 可以浏览的页面就越多。 本节我们为试图函数添加权限限制, 使其只可以被管理员或评论管理员访问。————————————————————————————————————一. 修改|-app/-main/views.py@main.route('/admin')...原创 2018-03-21 21:24:22 · 526 阅读 · 0 评论 -
9.1 为我们的角色划分权限
在第五章数据库的时候, 我们创建了Role表,并创建了不同的角色。不同的角色要有不同的权限, 本节我们来为角色划分权限。————————————————————————————————一.为我们的角色划分权限我们知道, 社交博客应该具有以下权限:操作位值关注用户0x00000001 (0x01)在他人文章发表评论0x00000010 (0x02)写文章0x00000100 (0x04)管理他人发表...原创 2018-03-20 16:52:14 · 693 阅读 · 0 评论 -
8.6 如何限制未认证用户访问有权限网页
——————————前言——————————————上节我们讲了注册时向用户发送确认邮件, 确认成功把用户的confirm属性值改为1, 默认为0.本节我们来利用这个confirm值来做些文章, 让未确认的用户登录以后不能看到主页, 显示一个页面提醒用户未确认账户, 让用户登录邮箱确认账户, 或者是选择重新发送确认邮件。——————————————————————————一. 修改|-app/-a...原创 2018-03-19 16:36:59 · 649 阅读 · 2 评论 -
8.5 用户注册时发送确认邮件功能——itsdangerous
__________________________________________________前言________________________________________________________我们先来看上节的注册视图函数:@auth.route('/register', methods=['GET', 'POST']) def register(): ...原创 2018-03-18 17:13:19 · 2383 阅读 · 0 评论 -
8.4 注册新用户
——————————————————————前言————————————————————————————本节讲解如何为我们的web程序添加注册新用户的功能。————————————————————————————————————————————————————一. 修改|-app/-auth/forms.pyfrom flask_wtf import FlaskFormfrom wtform...原创 2018-03-13 20:48:09 · 930 阅读 · 0 评论 -
8.3 为我们的web程序添加登录功能——flask-login
一. 安装flask-login扩展&pip install flask-login安装完新的扩展以后不要忘记更新requirements.txt文件:&pip freeze >requirements.txt二. 初始化扩展——|-app/__init__.py:from flask_login import LoginManagerlogin_manager = L...原创 2018-03-13 15:24:24 · 651 阅读 · 0 评论 -
8.2 创建认证蓝本
——————————————————————前言————————————————————————————之前我们讲过使用包和模块组织我们的web程序:|-flasky |-app/ #web程序相关的内容在app包里,包括以下内容: |-templates/ #响应返回的模板 |-static/ #响应返回的静态文件 |-main/ #蓝本 |-__init_...原创 2018-03-12 10:05:54 · 301 阅读 · 0 评论 -
8.1 使用Werkzeug实现密码散列(ps: 末尾有介绍@property装饰器)
————————————————————————前言——————————————————————————数据库中的密码是不安全的, 一旦恶意用户得到数据库的访问权, 那我们的密码就会被泄露, 利益必然受损。所以我们不应该在数据库中直接存储密码, 而是要存储密码对应的散列值。————————————————————————————————————————————————————一. 修改models...原创 2018-03-11 15:48:23 · 455 阅读 · 0 评论 -
7.1 大型程序的结构
——————————————————————前言————————————————————————————尽管在单一脚本文件中编写小型web程序很方便, 但是程序变复杂后, 使用单个大型源码文件会导致很多问题。Flask并不要求大型项目使用特定的组织方式, 程序结构的组织方式完全由开发者决定。本节我们介绍一种使用包和模块组织大型程序的方式。——————————————————————————————...原创 2018-03-08 19:58:59 · 1179 阅读 · 0 评论 -
6.1为我们的web程序添加发送邮件的功能
——————————————————————前言————————————————————————————为了和用户进行沟通, 我们在web程序中添加发送邮件的功能。————————————————————————————————————————————————————一. 安装flask-mail扩展&pip install flask-mail二. 修改hello.py文件from fl...原创 2018-03-05 15:48:32 · 1032 阅读 · 0 评论 -
4.5用flask-migrate实现数据库迁移
一. 安装扩展二. 修改hello.py 文件from flask_migrate import Migrate, MigrateCommand#...migrate = Migrate(app, db)manager.add_command('db', MigrateCommand) #集成python shell, 见上节,效果如下:三. 创建迁移仓库&python h...原创 2018-03-03 19:27:39 · 754 阅读 · 1 评论 -
4.4集成python shell——自动导入程序中的对象
——————————————————————前言————————————————————————————我们每次调用python hello.py shell时, 要用到app, db等对象时都要手动导入, 很繁琐枯燥, 本节我们来实现自动导入。————————————————————————————————————————————————————一. 修改hello.py脚本from flask...原创 2018-03-03 14:48:18 · 611 阅读 · 2 评论 -
4.3 数据库
——————————————————————前言————————————————————————————本节讲解使用flask-sqlalchemy扩展管理数据库。————————————————————————————————————————————————————一. 安装flask-sqlalchemy扩展&pip install flask-sqlalchemy二. 创建表1. 创...原创 2018-03-02 16:48:32 · 493 阅读 · 0 评论 -
4.2 Flash消息
———————————————————————前言———————————————————————————本节介绍如何在我们的程序中使用警示框。————————————————————————————————————————————————————一. 修改视图函数from flask import Flask, render_template, session, redirect, url_for...原创 2018-02-28 21:11:38 · 212 阅读 · 0 评论 -
4.1 web表单
——————————————————————前言————————————————————————————本节我们讲解flask-wtf扩展, 它可以把处理web表单的过程变成一种愉悦的体验。————————————————————————————————————————————————————一. 设置flask-wtfapp.config['SECRET_KEY'] = 'hard to gue...原创 2018-02-28 19:53:17 · 337 阅读 · 0 评论 -
4.1 附表——WTForms支持的表单字段和字段验证函数
一. WTForms支持的HTML标准字段字段类型说明StringField文本字段, 相当于type类型为text的input标签TextAreaField多行文本字段PasswordField密码文本字段HiddenField隐藏文本字段DateField文本字段, 值为datetime.date格式DateTimeField文本字段, 值为datetime.datetime格式Integer...原创 2018-02-26 16:16:40 · 1659 阅读 · 0 评论 -
3.8 使用Flask-Moment本地化日期和时间
一. 安装Flask-Moment扩展二. 初始化Flask-Momentfrom flask_moment import Moment#...moment = Moment(app)三.在HTML文档中引入moment.js和jquery.js bootstrap默认引入jquery.js库, 所以我们只需要引入moment.js即可{% block scripts %}{{ ...原创 2018-02-25 20:14:15 · 828 阅读 · 0 评论 -
3.7 静态文件
——————————————————————前言————————————————————————————— web程序不是仅由python代码和模板组成。 大多数web程序还会使用静态文件:HTML代码中引用的图片, javascript源码文件和CSS。————————————————————————————————————————————————————一. 问题的引出还记得第二章检查u...原创 2018-02-25 18:38:04 · 222 阅读 · 0 评论 -
3.6 链接
——————————————————————前言————————————————————————————上两节我们讲到模板, 模板中的导航条中有两个链接, 点击链接后的效果和在地址栏输入url并回车的效果一样, 都会触发路由返回响应。——————————————————————问题—————————————————————————————在模板中之间编写简单的url并不难, 但是会存在以下两个问题...原创 2018-02-10 10:39:42 · 212 阅读 · 0 评论 -
3.5 自定义错误页面
—————————————————————————前言——————————————————————————像常规路由一样, Flask允许程序使用基于模板的自定义错误页面。——————————————————————————————————————————————————————最常见的错误代码有两个: 1. 404, 客户端请求未知页面时显示 2. 500, 有未处理的异常时显示一....原创 2018-02-08 12:00:20 · 1703 阅读 · 0 评论 -
3.4 使用Flask-Bootstarp集成Twitter Bootstrap
—————————————————————————前言——————————————————————————Bootstrap: Twitter开发的一个开源框架, 它提供的用户组件可用于创建整洁且具有吸引力的网页, 这些网页还能兼容所有现代web浏览器。Bootstrap只是客户端框架, 不会直接涉及服务器。 服务器需要做的只是提供引用了Bootstrap层叠样式表(CSS)和Javasc原创 2018-02-03 16:35:01 · 459 阅读 · 0 评论