目录
Flask框架的基础教程:
一、web工作原理
1. B/S和C/S架构
- B/S:浏览器/服务器架构(客户端需要更新才行)
- C/S:客户端/服务器架构(刷新页面即可更新)(可能会成为主流)
2. WEB工作原理
客户端 > 服务器 > python(flask) > 数据库(mysql)
二、Flask框架
1. 简介
- 是一个非常小的框架,可以称为微型框架,只提供了一个强劲的核心,其他的功能都需要使用拓展来实现。意味着可以根据自己的需求量身打造;
2. 组成
- 调试、路由、wsgi系统
- 模板引擎(Jinja2)
3. 安装
pip install flask
4. 简单使用
- 创建Flask框架。(社区版没有直接创建的功能,专业版有)
# 导入Flask类库
from flask import Flask
# 创建应用实例
app = Flask(__naem__)
# 视图函数(路由)
@app.route('/')
def index():
return '<h1>Hello Flask!<h1>'
# 启动实施(只在当前模块运行)
if __name__ == '__main__':
app.run()
5. run方法参数
参数 | 说明 | 默认值 |
---|---|---|
debug | 代码更新是否自动重启 | False |
theaded | 是否开启多线程 | False |
port | 指定端口 | 5000 |
host | 指定主机(设置0.0.0.0可以通过本地IP访问) | 127.0.0.1 |
6. 请求和响应
变量 | 上下文 | 描述 |
---|---|---|
current_app | 应用上下文 | 相当与在主程序中激活的实例化app(app=Flask(__name__) ) |
g | 应用上下文 | 一次性函数,处理请求的临时变量。只在一个请求中被应用,下个请求开始时会自动重置 |
request | 请求上下文 | 请求对象。存放了客户端发来的HTTP信息 |
session | 请求上下文 | 记录用户和服务器之间的会话的。在服务器端记录需要记住的信息。(和cookie对应,cookies是记录在客户端的) |
7. 请求钩子装饰器
函数 | 描述 |
---|---|
before_first_request | 第一次请求之前 |
before_request | 每次请求之前 |
app.after_request | 没有异常,每次请求结束后 |
app.teardown_request | 有异常也会运行,每次请求结束后 |
说明:以上钩子函数若写在蓝图中,只能针对蓝本的请求。若想在蓝本中设置全局有效的函数,需要使用带app的钩子函数。如:before_first_request 变为 before_app_first_request。
8. 视图函数
1. 不带参数的视图函数
# 导入Flask类库
from flask import Flask
# 创建应用实例
app = Flask(__name__)
# 视图函数(路由)
@app.route('/index')
def index():
return '<h1>Hello Flask!<h1>'
# 启动实施(只在当前模块运行)
if __name__ == '__main__':
app.run()
2. 带参数的视图函数
# 导入Flask类库
from flask import Flask
# 创建应用实例
app = Flask(__name__)
# 视图函数(路由)
@app.route('/user/<username>')
def say_hello(username):
return '<h1>Hello %s !<h1>' % username
# 启动实施(只在当前模块运行)
if __name__ == '__main__':
app.run()
- 参数要写在<>中、
- 视图函数的参数要与路由中的一致
- 也可以指定参数类型(int/float/path),默认是字符串
3. 带类型限定(path)的视图函数
# 导入Flask类库
from flask import Flask
# 创建应用实例
app = Flask(__name__)
# 视图函数(路由)
@app.route('/user/<path:info>')
def test(info):
return info
# 启动实施(只在当前模块运行)
if __name__ == '__main__':
app.run()
前端运行结果:
- 路由中最后的"/"最好带上,否在访问时可能会报错。
9. 获取request请求值
# 导入Flask类库
from flask import Flask,request
# 创建应用实例
app = Flask(__name__)
# request
@app.route('/request/<path:info>')
def request_url(info):
# 完整的请求URL
return request.url
'''
url:127.0.0.1:5000/request/abc/def?username=xiaoming&pwd=123
网页返回值:http://127.0.0.1:5000/request/abc/def?username=xiaoming&pwd=123
'''
# 去掉GET参数的URL
return request.base_url
'''
网页返回值:http://127.0.0.1:5000/request/abc/def
'''
# 只有主机和端口的URL
return request.host_url
'''
网页返回值:http://127.0.0.1:5000/
'''
# 装饰器中写的路由地址
return request.path
'''
网页返回值:/request/abc/def
'''
# 请求方法类型
return request.method
'''
网页返回值:GET (也有可能时POST)
'''
# 远程地址
return request.remote_addr
'''
网页返回值:127.0.0.1:5000
'''
# 获取url参数
return request.args.get('username')
return request.args.get('pwd')
return str(request.args)
# 获取headers信息
return request.headers.get('User-Agent')
# 启动实施(只在当前模块运行)
if __name__ == '__main__':
app.run()
10. 响应的构造(make_response)
from flask import Flask,make_response
app = Flask(__name__)
@app.route('/response/')
def response():
# 不指定状态码,默认为200,表示OK
# return ‘OK’
# 构造一个404状态码
# 方法一
return 'not fount',404
# 方法二
# 导入make_response
# 自定义构造一个响应,然后返回200,构造也可以指定状态码404
res = make_response('我是通过函数构造的响应',404)
return res
if __name__ == '__main__':
app.run()
11. 重定向(redirect)
from flask import Flask,redirect
app = Flask(__name__)
@app.route('/old/)
def old():
# return '这里是原始内容。'
# 如果输入旧的old路由,会指向新的地址。
# 先输入一个外地请求试试
return redirect('https://www.baidu.com')
# 再输入一个本地请求试试
return redirect('/new/')
# 根据视图函数找到路由,指向方法:<url_for>中的参数'new'指向的是<函数名>
return redirect(url_for('new'))
return redirect(url_for('say_hello',username='xiaoming'))
@app.rout('/new/')
def new():
return '这里是新的内容'
if __name__ == '__main__':
app.run()
12. 终止abort
from flask import Flask
app = Flask(__name__)
@app.route('/login/')
def login