1.Flask URL和视图

1.1.第一个flask程序

  1. from flask import Flask
  2. #创建一个Flask对象,传递__name__参数进去
  3. app = Flask(__name__)
  4.  
  5. #url与视图映射
  6. @app.route('/')
  7. def hello_world():
  8. return 'Hello World!'
  9.  
  10. if __name__ == '__main__':
  11. app.run() #flask中的一个测试应用服务器

浏览器访问:http://127.0.0.1:5000/,也可以更改端口号: app.run(port=5001)

1.2.debug模式

 作用:

  • 如果抛出异常,在浏览器中可以看到具体错误信息
  • 在修改代码后,只要按“ctrl+s”,就会自动重启项目,不用手动重新运行

四种配置方式

第一种

  1. if __name__ == '__main__':
  2. app.run(debug=True)

第二种

  1. app.debug = True

第三种

  1. app.config.update(DEBUG=True)

第四种

新建config.py

  1. DEBUG = Ture

然后在主程序总导入引用

  1. import config
  2.  
  3. app.config.from_object(config)
  1. from flask import Flask
  2. import config
  3. #创建一个Flask对象,传递__name__参数进去
  4. app = Flask(__name__)
  5. # app.debug = True #第二种
  6. # app.config.update(DEBUG=True) #第三种
  7. app.config.from_object(config) #第四种
  8.  
  9. #url与视图映射
  10. @app.route('/')
  11. def hello_world():
  12. print('helloworkl')
  13. return 'Hello World!'
  14.  
  15. if __name__ == '__main__':
  16. # app.run(debug=True) #第一种
  17. app.run()

四种方式

1.3.配置文件

新建config.py

  1. DEBUG =True

主程序中两种引用方式

第一种:

  1. import config
  2.  
  3. app.config.from_object(config)

第二种

  1. app.config.from_pyfile('config.py')

1.4.url传参方式

普通传参方式

  1. @app.route('/p/<id>/')
  2. def article_detail(id):
  3. return '你访问的文章第%s篇'%id

指定参数类型

有以下几种类型:

  • string:默认的数据类型
  • int:接受整形
  • float:浮点型
  • path:和string的类似,但是接受斜杠
  • any:可以指定多个路径
  • uuid:只接受uuid字符串

(1)any

  1. @app.route('/<any(blog,user):url_path>/<id>')
  2. def detail(url_path,id):
  3. if url_path == 'blog':
  4. return '博客详情%s'%id
  5. else:
  6. return '用户详情%s'%id

(2)path

  1. @app.route('/article/<path:test>/')
  2. def test_article(test):
  3. return 'test_article:{}'.format(test)

获取参数

  1. from flask import Flask,request
  2.  
  3. @app.route('/tieba/')
  4. def tieba():
  5. wd = request.args.get('wd')
  6. return '获取的参数的是%s'%wd

1.5.url_for的使用

(1)通过视图函数解析出url

  1. from flask import Flask,url_for
  2.  
  3. @app.route('/')
  4. def hello_world():
  5. return url_for('my_list',page=2) #url_for里面:第一个是视图函数,第二个是url需要的参数
  6.  
  7. @app.route('/list/<page>/')
  8. def my_list(page):
  9. return 'my_list'

(2)url_for里面多的参数会当做搜索字符

  1. @app.route('/')
  2. def hello_world():
  3. return url_for('my_list',page=2,count=2)
  4.  
  5. @app.route('/list/<page>/')
  6. def my_list(page):
  7. return 'my_list'

1.6.Response

视图函数中可以返回的类型

  • 可以返回字符串,返回的字符串其实底层将这个字符串包装成了一个‘Response’对象
  • 可以返回元组,形式(响应体,状态码,头部信息),返回的元组其实底层将这个字符串包装成了一个‘Response’对象
  • 可以返回Response及其子类

实现一个自定义的Response对象

  • 继承自、‘Response’类
  • 实现方法‘force_type’
  • 指定‘app.response_class’为你自定义的‘Response’对象
  • 如果视图函数返回的数据,不是字符串,也不是元组,也不是Response对象,那么就会将返回值传给‘force_type’,然后将‘force_type’的返回值返回给前端 

实例:

  1. from flask import Flask,url_for,Response,jsonify
  2.  
  3. app = Flask(__name__)
  4.  
  5. class JsonResponse(Response):
  6.  
  7. @classmethod
  8. def force_type(cls, response, environ=None):
  9. '''
  10. 这个方法只有视图函数返回非字符、非元祖、非Response对象才会调用
  11. :param response:
  12. :param environ:
  13. :return:
  14. '''
  15. #把字典转换成json
  16. if isinstance(response,dict):
  17. #jsonify将字典转换成json对象,还将该对象包装成了一个Response对象
  18. response = jsonify(response)
  19. return super(JsonResponse, cls).force_type(response,environ)
  20.  
  21. app.response_class = JsonResponse
  22.  
  23. @app.route('/')
  24. def hello_world():
  25. return 'Hello world'
  26.  
  27. @app.route('/list1/')
  28. def list1():
  29. return Response('list1') #合法对象,直接返回
  30.  
  31. @app.route('/list3/')
  32. def list3():
  33. return {'username':'derek','age':18} #返回的是非字符、非元祖、非Response对象,所以执行force_type方法
  34.  
  35. if __name__ == '__main__':
  36.  
  37. app.run(debug=True)
  1. 因为/list3/返回的是字典类型,非字符、非元祖、非Response对象,所以执行force_type方法

1.7.add_url_rule

源码

主程序

  1. from flask import Flask,render_template,url_for
  2.  
  3. app = Flask(__name__)
  4. app.config.update({
  5. 'DEBUG':True,
  6. 'TEMPLATES_AUTO_RELOAD':True
  7. })
  8.  
  9. @app.route('/',endpoint='index')
  10. def hello_world():
  11. print(url_for("derek_list")) #通过endpoint找到对应的url /list/
  12. return render_template('index.html')
  13.  
  14. def my_list():
  15. return "列表页"
  16.  
  17. #三个参数
  18. #1.url
  19. #2.给url起个别名,如果没有指定endpoint,则默认使用视图函数的名字作为endpoint的值
  20. #3.视图函数
  21. app.add_url_rule('/list/',endpoint='derek_list',view_func=my_list)
  22.  
  23. with app.test_request_context():
  24. print(url_for('index')) # /
  25.  
  26. if __name__ == '__main__':
  27. 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与视图的映射

实例

  1. from flask import Flask,url_for,views
  2.  
  3. app = Flask(__name__)
  4. app.config.update({
  5. 'DEBUG':True,
  6. 'TEMPLATES_AUTO_RELOAD':True
  7. })
  8.  
  9. class ListView(views.View):
  10. def dispatch_request(self):
  11. return "我的列表页"
  12.  
  13. # 1.ListView.as_view('list')里面必须传个参数‘name’,给view_func起个别名,实际上就是dispatch_request函数
  14. # 2.endpoint也可以不指定,则默认使用view_func的别名(name参数的值)
  15. app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))
  16.  
  17. @app.route('/')
  18. def hello_world():
  19. return 'Hello World!'
  20.  
  21. with app.test_request_context():
  22. print(url_for('list')) #/list/
  23.  
  24. if __name__ == '__main__':
  25. app.run()

(2)通过类的继承实现多个视图返回json数据

  1. from flask import Flask,url_for,views,jsonify
  2.  
  3. app = Flask(__name__)
  4. app.config.update({
  5. 'DEBUG':True,
  6. 'TEMPLATES_AUTO_RELOAD':True
  7. })
  8.  
  9. #父类,把数据转换成json格式
  10. class JsonView(views.View):
  11. def get_data(self):
  12. raise NotImplementedError
  13.  
  14. def dispatch_request(self):
  15. return jsonify(self.get_data())
  16.  
  17. #子类只需要写get_data方法
  18. class ListView(JsonView):
  19. def get_data(self):
  20. return {"usernmae":'derek','age':18}
  21.  
  22. app.add_url_rule('/list/',endpoint='list',view_func=ListView.as_view('list'))
  23.  
  24. @app.route('/')
  25. def hello_world():
  26. return 'Hello World!'
  27.  
  28. if __name__ == '__main__':
  29. app.run()

(3)基于调度方法的类视图 

  1. class LoginView(views.MethodView):
  2. def __render(self,error=None):
  3. return render_template('login.html', error=error)
  4.  
  5. def get(self,error=None):
  6. return self.__render()
  7.  
  8. def post(self):
  9. username = request.form.get('username')
  10. password = request.form.get('password')
  11. if username == 'derek' and password == '123':
  12. return '登录成功'
  13. else:
  14. return self.__render(error='用户名或密码错误')
  15.  
  16. app.add_url_rule('/login/',view_func=LoginView.as_view('login'))
 
 
 



flask之URL和视图(一)的更多相关文章

  1. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  2. Flask学习 url和视图

    因为扫描器的准备使用Flask框架,所以开始恶补Flask和前后端的知识 Flask是一个使用Python编写的轻量级Web应用框架,作者是 Armin Ronacher(他也是 Werkzeug 及 ...

  3. 1.Flask URL和视图

    1.1.第一个flask程序 from flask import Flask #创建一个Flask对象,传递__name__参数进去 app = Flask(__name__) #url与视图映射 @ ...

  4. flask第七篇——URL与视图函数的映射

    有兴趣的朋友可以添加微信公众号:自动化测试实战 今天开始就要进入正题了.大家都准备好了吧~ 代码提示 先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法: ...

  5. python框架之Flask(2)-路由和视图&Session

    路由和视图 这一波主要是通过看源码加深对 Flask 中路由和视图的了解,可以先回顾一下装饰器的知识:[装饰器函数与进阶] 路由设置的两种方式 # 示例代码 from flask import Fla ...

  6. Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】

     一.Web框架概述  Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...

  7. URL与视图函数的映射

    今天跟大家讲的是URL与视图函数的映射 URL与视图函数的映射 url与视图函数的映射是通过@app.route()装饰器实现的. 1.只有一个斜杠代表的是根目录——首页. # coding: utf ...

  8. Django和Flask对于URL尾斜杠(back slash)的处理

    最近在看Flask,其中提到了对于URL尾斜杠的处理.感觉算是一个需要注意的地方吧,就和Django的处理方式来进行一个简单的对比. 首先说下什么是尾斜杠. http://www.baidu.com/ ...

  9. 【django基础补充之URL,视图,模版】

    一.url路由配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代 ...

随机推荐

  1. NSOperation的使用细节 [3]

    NSOperation的使用细节 [3] 这一节我们来写自定义concurrent的operation,自定义concurrent的operation稍微有点复杂,需要按照某些既定的步骤编写才可以完成 ...

  2. JDBC方式执行SQL,支持CRUD返回LIST

    背景: 用惯了Mybatis,接收一个老项目使用Hibernate,特别不习惯.新的功能需要系统后台定时执行任务,顾使用JDBC封装工具类执行 源代码 import java.sql.Connecti ...

  3. (1)Object类 (2)包装类和数学处理类 (3)String类

    1.Object类1.1 基本概念 java.lang.Object类是Java类层次结构的根类,任何类都是Object类的直接/间接子类. 1.2 常用的方法(重点) Object() - 无参构造 ...

  4. 一段滚动文字的js (jQuery)

    function startmarqueeOneSMS() { var t; var to; var ishover = false; var waitone = 3000; var speed = ...

  5. php实现简单的单链表

    <?php /** * 建立一个链表,节点的data为数组,记录一个id,完成链表所以操作 */ //结点,结点数据data定义为一个数组,id和value class Node{ public ...

  6. zookeeper环境搭建.md

    zookeeper 简介 ZooKeeper是一个为分布式应用所设计的分布的.开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布 ...

  7. 20165318 预备作业3 Linux安装及学习

    Linux安装及学习 一.VirtualBox和Ubuntu的安装 我安装的是VirtualBox 5.2.6和Ubuntu 16.04 LTS,安装过程按照老师博客中的步骤依次进行,出现了以下几个问 ...

  8. HBase学习之路 (一)HBase基础介绍

    产生背景 自 1970 年以来,关系数据库用于数据存储和维护有关问题的解决方案.大数据的出现后, 好多公司实现处理大数据并从中受益,并开始选择像 Hadoop 的解决方案.Hadoop 使用分 布式文 ...

  9. 常用的sql语法_Row_Number

    可用来分页,也可以用来egg:获取同类型的最新的信息 ROW_NUMBER() 说明:返回结果集分区内行的序列号,每个分区的第一行从1开始.语法:ROW_NUMBER () OVER  ([ < ...

  10. php5.6+Apache2.4+MySQL

    在配置php的时候可以直接使用集成环境XAMPP:https://bitnami.com/stack/xampp?utm_source=bitnami&utm_medium=installer ...