1.1. 第一个 flask 程序
- from flask import Flask
- # 创建一个 Flask 对象, 传递__name__参数进去
- App = Flask(__name__)
- #url 与视图映射
- @App.route('/')
- def hello_world():
- return 'Hello World!'
- if __name__ == '__main__':
- App.run() #flask 中的一个测试应用服务器
浏览器访问: http://127.0.0.1:5000/, 也可以更改端口号: App.run(port=5001)
1.2.debug 模式
作用:
如果抛出异常, 在浏览器中可以看到具体错误信息
在修改代码后, 只要按 "ctrl+s", 就会自动重启项目, 不用手动重新运行
四种配置方式
第一种
- if __name__ == '__main__':
- App.run(debug=True)
第二种
App.debug = True
第三种
App.config.update(DEBUG=True)
第四种
新建 config.py
DEBUG = Ture
然后在主程序总导入引用
cnfig 文件
- import config
- App.config.from_object(config)
另外的执行文件
- from flask import Flask
- import config
- # 创建一个 Flask 对象, 传递__name__参数进去
- App = Flask(__name__)
- # App.debug = True #第二种
- # App.config.update(DEBUG=True) #第三种
- App.config.from_object(config) #第四种
- #url 与视图映射
- @App.route('/')
- def hello_world():
- print('helloworkl')
- return 'Hello World!'
- if __name__ == '__main__':
- # App.run(debug=True) #第一种
- App.run()
1.3. 配置文件
新建 config.py
DEBUG =True
主程序中两种引用方式
第一种:
- import config
- App.config.from_object(config)
第二种
App.config.from_pyfile('config.py')
1.4.url 传参方式
普通传参方式
- @App.route('/p/<id>/')
- def article_detail(id):
- return '你访问的文章第 %s 篇'%id
指定参数类型
有以下几种类型:
string: 默认的数据类型
int: 接受整形
float: 浮点型
path: 和 string 的类似, 但是接受斜杠
any: 可以指定多个路径
uuid: 只接受 uuid 字符串
- (1)any
- @App.route('/<any(blog,user):url_path>/<id>')
- def detail(url_path,id):
- if url_path == 'blog':
- return '博客详情 %s'%id
- else:
- return '用户详情 %s'%id
- (2)path
- @App.route('/article/<path:test>/')
- def test_article(test):
- return 'test_article:{}'.format(test)
获取参数
- from flask import Flask,request
- @App.route('/tieba/')
- def tieba():
- wd = request.args.get('wd')
- return '获取的参数的是 %s'%wd
1.5.url_for 的使用
(1) 通过视图函数解析出 url
- from flask import Flask,url_for
- @App.route('/')
- def hello_world():
- return url_for('my_list',page=2) #url_for 里面: 第一个是视图函数, 第二个是 url 需要的参数
- @App.route('/list/<page>/')
- def my_list(page):
- return 'my_list'
(2)url_for 里面多的参数会当做搜索字符
- @App.route('/')
- def hello_world():
- return url_for('my_list',page=2,count=2)
- @App.route('/list/<page>/')
- def my_list(page):
- return 'my_list'
1.6.Response
视图函数中可以返回的类型
可以返回字符串, 返回的字符串其实底层将这个字符串包装成了一个'Response'对象
可以返回元组, 形式 (响应体, 状态码, 头部信息), 返回的元组其实底层将这个字符串包装成了一个'Response'对象
可以返回 Response 及其子类
实现一个自定义的 Response 对象
继承自,'Response'类
实现方法'force_type'
指定'app.response_class'为你自定义的'Response'对象
如果视图函数返回的数据, 不是字符串, 也不是元组, 也不是 Response 对象, 那么就会将返回值传给'force_type', 然后将'force_type'的返回值返回给前端
实例:
- from flask import Flask,url_for,Response,jsonify
- App = Flask(__name__)
- class JsonResponse(Response):
- @classmethod
- def force_type(cls, response, environ=None):
- '''
- 这个方法只有视图函数返回非字符, 非元祖, 非 Response 对象才会调用
- :param response:
- :param environ:
- :return:
- '''
- #把字典转换成 JSON
- if isinstance(response,dict):
- #jsonify 将字典转换成 JSON 对象, 还将该对象包装成了一个 Response 对象
- response = jsonify(response)
- return super(JsonResponse, cls).force_type(response,environ)
- App.response_class = JsonResponse
- @App.route('/')
- def hello_world():
- return 'Hello world'
- @App.route('/list1/')
- def list1():
- return Response('list1') #合法对象, 直接返回
- @App.route('/list3/')
- def list3():
- return {'username':'derek','age':18} #返回的是非字符, 非元祖, 非 Response 对象, 所以执行 force_type 方法
- if __name__ == '__main__':
- App.run(debug=True)
因为 / list3 / 返回的是字典类型, 非字符, 非元祖, 非 Response 对象, 所以执行 force_type 方法
1.7.add_url_rule
源码
主程序
- from flask import Flask,render_template,url_for
- App = Flask(__name__)
- App.config.update({
- 'DEBUG':True,
- 'TEMPLATES_AUTO_RELOAD':True
- })
- @App.route('/',endpoint='index')
- def hello_world():
- print(url_for("derek_list")) #通过 endpoint 找到对应的 url /list/
- return render_template('index.html')
- def my_list():
- return "列表页"
- # 三个参数
- #1.url
- #2. 给 url 起个别名, 如果没有指定 endpoint, 则默认使用视图函数的名字作为 endpoint 的值
- #3. 视图函数
- App.add_url_rule('/list/',endpoint='derek_list',view_func=my_list)
- with App.test_request_context():
- print(url_for('index')) # /
- if __name__ == '__main__':
- App.run()
1.8. 类视图
之前使用的视图都是函数, 简称为视图函数, 视图也可以基于类来实现, 类视图的好处是支持继承, 类视图需要通过 App.add_url_role(url_rule,view_func) 来进行注册, 类里面要加装饰器就用: detactors=[] , 里面可以添加多个装饰器
(1) 标准视图
继承 views.VIew
必须实现'dispatch_request'方法, 以后请求过来后, 都会执行这个方法, 返回值相当于视图函数一样, 必须返回'Response'或者子类的对象, 或者是字符串, 或者是元祖
必须通过 App.add_url_role(url_rule,view_func) 来做 url 与视图的映射
实例
- from flask import Flask,url_for,views
- App = Flask(__name__)
- App.config.update({
- 'DEBUG':True,
- 'TEMPLATES_AUTO_RELOAD':True
- })
- class ListView(views.View):
- def dispatch_request(self):
- return "我的列表页"
- # 1.ListView.as_view('list') 里面必须传个参数'name', 给 view_func 起个别名, 实际上就是 dispatch_request 函数
- # 2.endpoint 也可以不指定, 则默认使用 view_func 的别名 (name 参数的值)
- App.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))
- @App.route('/')
- def hello_world():
- return 'Hello World!'
- with App.test_request_context():
- print(url_for('list')) #/list/
- if __name__ == '__main__':
- App.run()
(2) 通过类的继承实现多个视图返回 JSON 数据
- from flask import Flask,url_for,views,jsonify
- App = Flask(__name__)
- App.config.update({
- 'DEBUG':True,
- 'TEMPLATES_AUTO_RELOAD':True
- })
- # 父类, 把数据转换成 JSON 格式
- class JsonView(views.View):
- def get_data(self):
- raise NotImplementedError
- def dispatch_request(self):
- return jsonify(self.get_data())
- # 子类只需要写 get_data 方法
- class ListView(JsonView):
- def get_data(self):
- return {"usernmae":'derek','age':18}
- App.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))
- @App.route('/')
- def hello_world():
- return 'Hello World!'
- if __name__ == '__main__':
- App.run()
(3) 基于调度方法的类视图
- class LoginView(views.MethodView):
- def __render(self,error=None):
- return render_template('login.html', error=error)
- def get(self,error=None):
- return self.__render()
- def post(self):
- username = request.form.get('username')
- password = request.form.get('password')
- if username == 'derek' and password == '123':
- return '登录成功'
- else:
- return self.__render(error='用户名或密码错误')
- App.add_url_rule('/login/',view_func=LoginView.as_view('login'))
- import sys
- reload(sys)
- sys.setdefaultencoding('utf-8')
来源: http://www.bubuko.com/infodetail-3475295.html