1.编写helloworld
"""
编写最简单的flask程序,7行代码
"""""
#1.从flask模块中导入Flask类
from flask import Flask
#2.通过Flask类创建应用程序对象
#默认参数: __name__,表示当前程序的启动入口,值是__main__, 如果从其他模块调用过来的值是模块名字demo02helloworld
#默认参数:static_folder, 静态资源文件夹,默认是static
#默认参数: static_url_path, 静态资源访问路径, /static
#默认参数: template_folder, 模板文件夹,默认是:templates
app = Flask(__name__)
print(__name__)
print(app.static_folder)
print(app.static_url_path)
print(app.template_folder)
#使用app装饰器,绑定路由路径,绑定视图函数
@app.route('/haha')
def hello_world():
return "helloworld"
#程序启动入口
if __name__ == '__main__':
#默认参数: host,IP地址127.0.0.1
#默认参数: port, 5000
app.run()
2.url_map
url_map: 存放在所有使用应用装饰绑定的,路径和视图函数
格式: app.url_map,返回的是一个map集合,表示的视图函数和路径之间的映射关系
from flask import Flask
app = Flask(__name__)
@app.route('/index')
def index2():
return "<h1>首页内容</h1>"
@app.route('/index3')
def index3():
return "<h1>商品内容</h1>"
def index4():
return "<h1>hahaha</h1>"
if __name__ == '__main__':
print(app.url_map)
app.run()
map中的数据格式, 其中static是默认的,其余的是在使用@app.route装饰器之后,才会加到map中的.
格式如下:
Map([<Rule '/index3' (HEAD, GET, OPTIONS) -> index3>,
<Rule '/index' (HEAD, GET, OPTIONS) -> index2>,
<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>])
3.路由和视图函数的关系
如果一个路由装饰多个视图函数,那么优先访问的是哪个视图函数
答:先装饰的优先访问如果多个路由装饰一个函数, 通过哪些路由路径,可以访问到该视图函数
答:通过每个路径都可以访问
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "helloworld"
@app.route('/')
def hello_world2():
return "helloworld2"
@app.route('/index1')
@app.route('/index2')
@app.route('/index3')
def index():
return "index"
if __name__ == '__main__':
print(app.url_map)
app.run()
4.设置访问方式
如何在访问视图函数的时候指定对应的访问方式? 需要使用methods
格式: @app.route(‘路径’,methods=[“访问方式1”,”访问方式2”,…])
常见的访问方式有: GET,POST,PUT,DELETE
注意点:如果不指定访问方式,默认是GET
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "helloworld"
@app.route('/',methods=["POST","GET","PUT"])
def hello_world2():
return "helloworld2"
if __name__ == '__main__':
app.run(debug=True)
5.url_for
url_for: 反解析,可以通过视图函数的名称找到路由路径
格式: url_for(‘视图函数名称’,参数)
参数格式: key = value
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/taobao')
def taobao():
print(url_for('jingdong'))
return "我这里没有,找: <a href='%s'>班长</a>"%url_for('jingdong')
@app.route('/jingdong')
def jingdong():
return "我是京东,我什么都有"
if __name__ == '__main__':
app.run()
6.redirect 重定向
redirect: 重定向,通过路由路径,找到对应的视图函数.
格式: redirect(‘路径’)
特点: 两次请求
浏览器一旦检查到状态码为: 302(重定向代号)
from flask import Flask,redirect,url_for
app = Flask(__name__)
@app.route('/taobao')
def taobao():
# return "helloworld"
# return redirect("/jingdong")
#返回响应体,携带状态码302, 浏览器检测到之后,自动跳转到响应的指定路径
return redirect(url_for('jingdong'))
@app.route('/jingdong')
def jingdong():
return "我是京东,我很快"
if __name__ == '__main__':
app.run()
7. 返回Json数据
如何返回json数据给客户端,一般后端程序和前端之后的数据交互格式都是json.
有两种指定方式:
1. 可以手动去指定Content-Type 为 application/json
2. 可以使用jsonify()方法返回json数据格式, 推荐使用
from flask import Flask, make_response, jsonify
app = Flask(__name__)
@app.route('/')
def hello_world():
# 1.可以手动去指定Content-Type 为 application/json, 创建响应体对象,手动指定格式类型
# resp = make_response("helloworld")
# resp.headers["Content-Type"] = "application/json"
#2.可以使用jsonify()方法返回json数据格式, 推荐使用
# dict = {
# "name":"zhangsan",
# "age":"13"
# }
# return jsonify(dict)
return jsonify(name='banzang',age="13")
if __name__ == '__main__':
app.run()
8.给路由传参
- 在访问视图函数的时候,如何传递数据类型格式
- 格式: @app.route(‘/路径/<数据类型:变量名>’)
- 数据类型种类:
- int 表示整数
- float 表示小数
- path 表示字符串类型,如果不写默认就是path
- 数据类型种类:
"""
"""""
from flask import Flask
app = Flask(__name__)
@app.route('/<int:num>')
def int_num(num):
return "the num is %s"%num
@app.route('/<float:num>')
def float_num(num):
return "the num is %s"%num
@app.route('/<path:num>')
def path_num(num):
return "the num is %s"%num
if __name__ == '__main__':
app.run(debug=True)
9.正则匹配路由
之所以int,float,path可以过滤不同的数据类型,是因为系统已经包含了这些类型的转换器(添加到默认的转换器列表中)
需求: 希望能够有过滤三位整数的转换器
当系统提供的转换器满足不了需求的时候,使用自定义转换器
* 格式:
* 1.自定义类,继承自BaseConverter
* 2.编写init方法,接收两个参数,一个给父类初始化,一个子类自己
* 3.将自定义转换器类添加到默认的转换器列表中
"""
"""""
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 1.自定义类,继承自BaseConverter
class MyRegexConverter(BaseConverter):
#规则固定死了,不够灵活,应该交给视图函数自己
# regex = '\d{3}'
# 2.编写init方法,接收两个参数,一个给父类初始化,一个子类自己
def __init__(self,url_map,regex):
#初始化父类空间
super(MyRegexConverter, self).__init__(url_map)
#初始化子类自己的规则
self.regex = regex
#to_python方法, 在此拦截,过滤数据,编码工作
#在匹配到路径之后,执行视图函数之前
def to_python(self, value):
print("value = %s"%value)
return int(value) + 10
# 3.将自定义转换器类添加到默认的转换器列表中
#添加自定义转换器列表到,默认转换器列表中
app.url_map.converters["re"] = MyRegexConverter
#输出默认的转换器列表
# print(app.url_map.converters)
#过滤三位整数
@app.route("/<re('\d{3}'):num>")
def hello_world(num):
print("hello_world")
return "the num is %s"%num
#过滤手机号
@app.route("/<re('1[345678]\d{9}'):mobile>")
def get_phone_num(mobile):
return "the mobile is %s"%mobile
if __name__ == '__main__':
app.run(debug=True)
10 异常捕获
abort(代号): 主动跑出异常,停止该视图函数的执行
@app.errorhandler(代号/异常对象), 装饰函数,处理对应的异常页面,配合abort使用
from flask import Flask, abort
app = Flask(__name__)
@app.route('/<int:age>')
def hello_world(age):
#判断如果年龄小于13岁,
if age < 13:
abort(404)
raise(Exception('Big ERROR'))
return "helloworld"
@app.errorhandler(404)
def page_not_found(e):
print(e)
return "服务器搬家了!!"
@app.errorhandler(Exception)
def big_error(e):
return "服务器内部产生严重问题了!!"
if __name__ == '__main__':
app.run()
11.配置debug
在运行程序的时候,每当改变代码之后能不能不需要重新启动就可以部署呢?
在app.run中可以设置host port
可以设置启动模式: debug=True
* 好处:
* 1. 代码改变之后程序不需要重新启动
* 2. 服务器内部出错之后,在界面有友好提示
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
# print('helloworld')
1/0
return "helloworld"
if __name__ == '__main__':
#参数host : 127.0.0.1 / 0.0.0.0可以在同一台电脑通过虚拟机访问
#参数port: 5000
#参数debug: False
app.run(host='0.0.0.0',port=5001,debug=True)
12.request
request: 里面封装的是核请求参数有关的内容,比如: 请求路径,请求方式,请求参数等等.
from flask import Flask,request
app = Flask(__name__)
@app.route('/')
def hello_world():
print(request.url)
print(request.method)
print(request.args)
return "helloworld"
if __name__ == '__main__':
app.run(debug=True)