1.Flask URL和视图
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
然后在主程序总导入引用
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方法
posted on 2018-05-28 14:06 zhang_derek 阅读(...) 评论(...) 编辑 收藏