flask项目的基本目录结构:
flask项目名
|_____static #静态文件的存放目录
|_____templates #模板的存放目录
|_____项目名.py #主项目
|_____config.py #配置文件
#例:
#项目名.py
from flask import Flask
app = Flask(__name__) #app是程序实例,一个项目只能有一个程序实例
@app.route('/') #路由装饰器
def hello_world(): #视图函数
return 'Hello World!'
if __name__ == '__main__':
app.run() #有个host参数,代表监听范围,默认为127.0.0.1,只监听本机,0.0.0.0表示监听所有公网ip
@app.route()装饰器,可以将函数变为视图函数,他的参数为路由。
flask的开发web服务器支持很多选项,但只能在脚本中作为参数传给app.run()函数,然而传递设置选项的理想方式是使用命令行参数。Flask-Script是一个Flask的扩展,为Flask程序添加了一个命令行解析器。
#安装:pip install flask-script
#hello.py
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app) #实例化拓展
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
manager.run() 启动实例
修改代码后,使用命令行启动程序(python hello.py runserver
)时就可以添加参数了: –host/-h 客户端访问web服务的ip
–port/-p web服务的端口
-d 开启debug
-r 自动reload,当代码发生变化时自动重启
–threaded 开启多线程
-?/–help 查看帮助信息
将工程配置下写在配置文件中,利于以后的开发维护管理。
#config.py
DEBUG = True #设置工程为开发者
'''
其他配置参数,如数据库的配置等等
'''
#工程文件
import config
app.config.from_objec(config) #将配置文件配置到项目文件中
路由传递参数:app.route('/index/\
参数放在尖括号里,可以设置参数的类型,int
, float
,path(/将不再是路径分隔符)
,如:\
url重定向:redirect('\<跳转的路由>')
解析路由:url_for(视图函数名)
,在模板中页面跳转也可以使用url_for()解析得到路由,放在{{ }}
中
@app.route('/index/') #普通路由
def index():
return 'hello world'
@app.route('/add//') #带参数的路由
def add(ag1, arg2):
return 'arg1 +arg2 = {}'.format(arg1+arg2)
@app.route('/hello')
def hello():
return rendirect(url_for('index')) #路由重定向和重定向一起使用
变量名 | 上下文 | 说明 |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时用作临时存储的对象,每次请求都会重设这个变量。 |
request | 请求上下文 | 请求对象,封装了客户端发送的HTTP请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要记住的值的词典 |
Flask在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程序上下文被推送后,就可以在线程中使用current_app和g变量。类似地,请求上下文被推送后,就可以使用request和session变量。如果使用这些变量时我们没有激活程序上下文或请求上下文,就会导致报错。
封装了客户端发送的HTTP请求中的内容。
request.headers 请求头信息,数据类型为类字典结构,可以使用.get(”)获取数据。
#例:
@app.route('/request/')
def req():
# 完整的请求URL
#return request.url
# 基本路由信息,不包含get参数
#return request.base_url
# 只包含主机和端口
#return request.host_url
# 只包含装饰器中的路由地址
#return request.path
# 请求方法类型
#return request.method
# 客户端IP地址
#return request.remote_addr
# 所有的请求参数(GET)
#return request.args['page']
# 请求头信息
return request.headers['User-Agent']
响应的两种方法:
视图函数直接返回一个元组:(response, status, headers)
视图函数返回一个make_response(键,值)函数产生的响应对象。
访问:通过请求对象的cookies属性访问(请求对象的cookies属性是一个内容为客户端提提交的所有cookies的字典)
设置cookies:通过响应对象的set_cookies方法来设置Cookies。
from flask import Flask, request, make_response
@app.route('/cookies/')
def cookies():
cook = request.cookies #获得cookies
resp = make_response('set cookies') #实例一个响应对象
resp.set_cookies('name','Tom') #设置cookies
return resp
#设置秘钥:使用session就必须设置密码,以便用来对数据加密
app.config['SECRET_KEY'] = '随便什么字符串'
@app.route('/set_sesion/')
def set_session():
session['user-name'] = 'hello'
return '设置成功'
@app.route('/get_session/')
def get_session():
return session.get('username', 'who?')
4种钩子装饰器:
before_first_request:在处理第一个请求之前执行
before_request:在每次请求之前运行。
after_request:如果没有未处理的异常抛出在,在每次请求之后执行
teardown_request:即使有未处理的异常抛出,也在每次请求之后运行。