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)
作用:
四种配置方式
第一种
if __name__ == ‘__main__‘: app.run(debug=True)
第二种
app.debug = True
第三种
app.config.update(DEBUG=True)
第四种
新建config.py
DEBUG = Ture
然后在主程序总导入引用
import configapp.config.from_object(config)
from flask import Flaskimport 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()
四种方式
新建config.py
DEBUG =True
主程序中两种引用方式
第一种:
import configapp.config.from_object(config)
第二种
app.config.from_pyfile(‘config.py‘)
普通传参方式
@app.route(‘/p/<id>/‘)def article_detail(id): return ‘你访问的文章第%s篇‘%id
指定参数类型
有以下几种类型:
(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)通过视图函数解析出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‘
视图函数中可以返回的类型
实现一个自定义的Response对象
实例:
from flask import Flask,url_for,Response,jsonifyapp = 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方法
主程序
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()
之前使用的视图都是函数,简称为视图函数,视图也可以基于类来实现,类视图的好处是支持继承,类视图需要通过app.add_url_role(url_rule,view_func)来进行注册,类里面要加装饰器就用:detactors=[] ,里面可以添加多个装饰器
(1)标准视图
实例
from flask import Flask,url_for,viewsapp = 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‘))
评论(
0) © 2014
mamicode.com 版权所有
京ICP备13008772号-2 联系我们:gaon5@hotmail.com 迷上了代码!