Flask之旅《Flask Web开发:基于Python的Web应用开发实战》学习笔记

本文是基于《Flask Web开发:基于Python的Web应用开发实战》的学习笔记,涵盖了虚拟环境设置、Flask基本结构、模板、表单、数据库、电子邮件、大型程序结构、用户认证等方面。讲解了如何处理端口、使用模板引擎、数据库迁移、错误处理、电子邮件发送、RESTful API等关键概念。同时提到了Flask扩展如Flask-Bootstrap、Flask-SQLAlchemy和Flask-Login的使用。
摘要由CSDN通过智能技术生成


《Flask Web开发:基于Python的Web应用开发实战》




点击上方的“目录”快速到达哦!

虽然简单的网站(Flask+Python+SAE)已经上线,但只是入门。开发大型网站,系统地学习一遍还是有必要的。
20161018: 实际应用网站上线,实现天涯VIP功能:http://tianya.heroku.com

1 虚拟环境


2016-6-8
书上介绍了 virtualenv,每个venv都会拷贝一份packages到项目 /venv目录。
virtualenv venv
venv\Scripts\activate.bat
(venv) $ pip freeze >requirements.txt
(venv) $ pip install -r requirements.txt
pip list --outdated
pip install --upgarade <Package1> <PackageN>
比较了一下conda管理环境,可能conda更胜一筹: 点击打开链接

或者用  virtualenvwrapper: 点击打开链接

git tag 列出所有打tag的分支
git checkout <tag_name> 切换到tag
git reset --hard 不保留修改
.gitignore:指定哪些文件或目录不作同步,比如 ./venv/,*.pyc,数据库文件.sqlite3, .mysql

推荐IDE: PyCharm 2016.1
导入已有的virtualenv: File -> Setting -> Project Interprater -> 选择项目目录下的/venv/Python
特点:
-> new Flask Project
-> jump between View funcion and Templates
-> Git


2 基本结构


初始化:
# -*- coding: utf-8 -*-
from flask import Flask
    app = Flask(__name__)
Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。在大多数程序中,Python的__name__变量就是所需的值。Flask用这个参数 决定程序的根目录,以便稍后能够找到相对于程序根目录的资源文件位置

路由 (route)和视图函数 (view function):
定义路由的最简便方式,是使用程序实例提供的app.route修饰器,把修饰的函数注册为路由
@app.route('/')
def index():
    return '<h1>Hello World!</h1>'
修饰器是Python语言的标准特性,可以使用不同的方式修改函数的行为。惯常用法是使用修饰器把函数注册为事件的处理程序。

动态路由:地址中可以包含可变部分,Flask支持在路由中使用int、float和path类型。path类型也是字符串,但不把斜线视作分隔符
@app.route('/user/<name>')
def user(name):
    return '<h1>Hello, %s!</h1>' %name
@app.route('/user/<int:id>') # 不能有空格!
def ...
默认端口是5000,可以改成其它的(flask_script.Manager也有此功能)
python manage.py runserver -p 7777
# 有些端口不能用,查询已占用的端口:netstat -ano;netstat -aon|findstr "6000";tasklist|findstr "<PID>";taskkill /f /t /im XXX.exe
app.run(debug=True, port=7777) 
  1. 公认端口(Well Known Ports):从0到1023,紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务协议。80端口实际上总是HTTP通讯。
  2. 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。
  3. 动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。

请求-响应循环

Context 上下文全局变量:
  • current_app 程序上下文 当前激活程序的程序实例
  • g 程序上下文 处理请求时用作临时存储的对象。每次请求都会重设这个变量
  • request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
  • session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典
URL映射是URL和视图函数之间的对应关系。Flask使用app.route修饰器或者非修饰器形式的app.add_url_rule()生成映射。
app.url_map
Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
<Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])
HEAD、Options、GET是请求方法,由路由进行处理。Flask为每个路由都指定了请求方法,这样不同的请求方法发送到相同的URL上时,会使用不同的视图函数进行处理。HEAD和OPTIONS方法由Flask自动处理

请求 Hook: 在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g
  1. before_first_request •  :注册一个函数,在处理第一个请求之前运行。
  2. before_request •  :注册一个函数,在每次请求之前运行。
  3. after_request •  :注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。
  4. teardown_request •  :注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行
响应(视图函数返回)
  • make_response()函数可接受1~3个参数 (html, 状态码,header)
response = make_response('<h1>This document carries a cookie!</h1>', 200)
response.set_cookie('answer', '42')
return response
  • 重定向的特殊响应类型,302:return redirect('http://www.example.com')
  • 特殊的响应由abort函数生成,用于处理错误:abort(404)
Flask扩展
原书更正: Importing flask.ext.script is deprecated, use flask_script instead.


3 模板 template


业务逻辑和表现逻辑 要分开
按功能分(模板不需要重用时),或按Division分(大部分模板需要重用时)

Jinja2模板引擎
模板是一个包含响应文本的文件,其中包含用 占位变量{ {...}}表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为 渲染。
@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)
模板变量
Jinja2能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象
<p>A value from a dictionary: {
   { mydict['key'] }}.</p>
<p>A value from a list: {
   { mylist[3] }}.</p>
<p>A value from a list, with a variable index: {
   { mylist[myintvar] }}.</p>
<p>A value from an object's method: {
   { myobj.somemethod() }}.</p>
可以使用 过滤器修改变量。千万别在不可信的值上使用safe过滤器,例如用户在表单中输入的文本
Hello, {
   { name|capitalize }
  • safe 渲染值时不转义。默认情况下,出于安全考虑,Jinja2会转义所有变量
  • capitalize 把值的首字母转换成大写,其他字母转换成小写
  • lower 把值转换成小写形式
  • upper 把值转换成大写形式
  • title 把值中每个单词的首字母都转换成大写
  • trim 把值的首尾空格去掉
  • striptags 渲染之前把值中所有的HTML标签都删掉
控制结构{%...%},可用来改变模板的渲染流程 if, for, macro, import, include

需要在多处重复使用的模板代码片段可以写入单独的文件,再包含 {%include 'common.html' %} 在所有模板中

另一种重复使用代码的强大方式是 模板继承,block标签定义的元素可在衍生模板中修改
<html>
<head>
  {%block head %}
  <title>{%block title %}{%endblock %} - My Application</title>
  {%endblock %}
</head>
<body>
  {%block body %}
  {%endblock %}
</body>
</html>
extends指令声明这个模板衍生自base.html。在 extends指令之后,基模板中的3个块被重新定义,模板引擎会将其插入适当的位置。注意新定义的head块,在基模板中其内容不是空的,所以使用 super()获取原来的内容(向已经有内容的块中添加新内容)。
{%extends "base.html" %}
{%block title %}Index{%endblock %}
{%block head %}
  {
   { super() }}
  <style>
  </style>
{%endblock %}
{%block body %}
  <h1>Hello, World!</h1>
{%endblock %}
使用Flask-Bootstrap
Bootstrap是客户端框架,因此不会直接涉及服务器。服务器需要做的只是提供引用了Bootstrap层 叠样式表(CSS)和JavaScript文 件的HTML响 应,并在HTML、CSS和JavaScript代码中实例化所需组件。这些操作最理想的执行场所就是模板。
Flask-Bootstrap基模板中定义的块:doc, head, title, styles, body, navbar, content, scripts
Bootstrap 官方文档

CDN本地加速:
修改 Base.html,引用本地的css 文件,里面元素跟Bootstrap 重名的,则会覆盖官方里相同元素
{% block head %}
  {
   {super()}}
  <link rel="shortcut icon" href="{
   { url_for('static', filename='favicon.ico') }}" type="image/x-icon">
  <link rel="icon" href="{
   { url_for('static', filename='favicon.ico') }}" type="image/x-icon">
  <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css">
{% endblock %}
。。。
{% block scripts %}
  {
   {super()}}
  <script src="//cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
  <script src="//cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.min.js"></scri
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值