一、前言
学习这本书,然后自己对其中的代码加了一些注释,便于学习和理解。
代码可以在https://github.com/greyli/helloflask/下载到
二、C/S和B/S
先看两张书上的图:
第一张图是C/S架构的图,C(Client,用户),S(Server,服务器)
第二张是Flask Web的工作流程
客户端先通过http,用URL向服务器端发送请求,然后服务器端通过一个约定好的叫做WSGI的标准,与Flask程序交互,返回Flask处理好的东西,然后再通过Web服务器传回客户端浏览器。
三、MVC和MTV框架模式
MVC是一种常用的框架模式,MTV是Flask所用的框架模式,但是二者相差不大。
- MVC的V(view)对应的是MTV的T(template),二者都起视图展示的作用,只是叫法不同,在Flask中,template主要由待渲染的HTML文件组成。
- MVC的C(control)对应的是MTV的V(view),这里要注意的是,这个view是视图函数,其实它起一个控制器的作用,视图函数的意思就是用来控制视图的函数。
- MVC和MTV的M指的是模型,用来处理程序需要操作的数据,先按下不表,以后再提到。
四、代码及注释
import os
try:
from urlparse import urlparse, urljoin
except ImportError:
from urllib.parse import urlparse, urljoin
from jinja2 import escape
from jinja2.utils import generate_lorem_ipsum
from flask import Flask, make_response, request, redirect, url_for, abort, session, jsonify
app = Flask(__name__)
app.secret_key = os.getenv('SECRET_KEY', 'secret string')#这个和cookie还有session有关,用来设置session秘钥
# get name value from query string and cookie #从query string和cookie中,查询name变量
#query string指的是查询字符串,详见P29,比如URL:http://helloflask.com/hello?name=Grey,其中的?name=Grey
@app.route('/')#一般来讲必须有主页的视图,不然容易报错,这里是让/主页和/'hello',共用了一个视图函数,会返回相同的效果。
@app.route('/hello')
def hello():
name = request.args.get('name')#args从url的query中找到name后面的键值,这里不能用cookies,因为还没生成对应的cookies
if name is None:#记得判断如果为空,则默认为human
name = request.cookies.get('name', 'Human')#第一个参数是self key,即键,就设置为name就行了,# 第二个参数是default值,get函数既有返回值,又能进行赋值处理
#如果后面生成了cookie的话,这里可以用cookies(下面那个set_cookie视图函数可以生成cookie
response = '<h1>Hello, %s!</h1>' % escape(name) # escape name to avoid XSS
# return different response according to the user's authentication status
# 根据用户的身份验证状态返回不同的响应
if 'logged_in' in session:
response += '[Authenticated]'
else