一。flask的形成。

  flask是一个基于python并且以来jinja2模板和werkzeug wsgi服务器的一个微型框架。

  安装了flask模块就代表安装了wekzeug,所以先安装flask.

pip install flask

  而werkzeug 的使用可以参考下面:

from wsgiref.simple_server import make_server

def mya(environ, start_response):
print(environ)
start_response('200 OK', [('Content-Type', 'text/html')])
if environ.get('PATH_INFO') == '/index':
with open('index.html','rb') as f:
data=f.read() elif environ.get('PATH_INFO') == '/login':
with open('login.html', 'rb') as f:
data = f.read()
else:
data=b'<h1>Hello, web!</h1>'
return [data] if __name__ == '__main__':
myserver = make_server('', 8011, mya)
print('监听8011')
myserver.serve_forever()

二。flask启动分析。

  基本的flask的使用如下:

from  flask import Flask
app=Flask(__name__) @app.route('/')
def index():
return "ok" if __name__ == '__main__':
#本质是 run_simple(host, port, app, **options)
#app(),对象加(),执行__call__
app.run()

  当app.run运行的时候,首先生成类,类的__call__方法首先创建运行的就是wsgi_app方法,首先把运行环境搭建。

  在app中的run方法本质就是执行run_simple方法,run_simple方法所做的就是werkzeug.serving中的。

三。flask中的4剑客,

  和django中一样flask也有4个视图函数,对应关系如下:

  Httpresponse = > ''

  render            => render_template

  redirect          => redirect

  JsonResponse  =>  jsonify

  1.''

  直接返回字符串到页面。

  2.render_template

  返回一个模板,并通过关键字传参的方式将数据发送到模板进行渲染。

  3.redirect

  跳转页面,需要传入路由。

  4.jsonify

  需要返回json数据。

四。flask的配置文件方式。

  当flask需要配置文件的时候,有以下主要的四种方式:

  1.直接通过app=flask(__name__),中的app,修改其中参数。:

app.debug=True
app.secret_key=""

  2.以字典的形式修改其中的cinfig

app.config['DEBUG']=True

  3.以文件的形式

app.config.from_pyfile("settings.py")

  setting.py

  DEBUG = True

  4.通过文件中的类名进行的插拔式的设置,一般这种设置都放在一个文件中:

app.config.from_object("python类或类的路径")

app.config.from_object('pro_flask.settings.TestingConfig')

  settings

class Config(object):
DEBUG = False
TESTING = False
DATABASE_URI = 'sqlite://:memory:' class ProductionConfig(Config):
DATABASE_URI = 'mysql://user@localhost/foo' class DevelopmentConfig(Config):
DEBUG = True class TestingConfig(Config):
TESTING = True

  配置的元素:

 {
'DEBUG': get_debug_flag(default=False), 是否开启Debug模式
'TESTING': False, 是否开启测试模式
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': timedelta(days=31),
'USE_X_SENDFILE': False,
'LOGGER_NAME': None,
'LOGGER_HANDLER_POLICY': 'always',
'SERVER_NAME': None,
'APPLICATION_ROOT': None,
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': timedelta(hours=12),
'TRAP_BAD_REQUEST_ERRORS': False,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': True,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None,
}

五。路由系统。

  路由一般是以装饰器的方式放到需要进行修饰的视图函数上。

@app.route('/login',methods=['POST',"GET"],endpoint="sb")
def login():
return "login"

  在route中,其中的是一个decorator运行的是add_url_rule():

  rule是一个路由,代表网页访问它所使用的路由。

  endpoint是视图函数起的别名。

  f 代表的是传入的视图函数。

  **options代表其他参数。

  1.add_url_rule

  这个函数中会具体实现视图函数,返回值,并弹出methons,判断它的请求方式:

  endpoint代表的是在视图函数中,通过url_for反向解析出的路由。也就是取别名,但是每个别名不能相同。#add_url_rule 源码中,

  endpoint如果为空,endpoint = _endpoint_from_view_func(view_func),最终取view_func.__name__(函数名)。

  app的写法还有以下这种:

app.add_url_rule('/login/<string:nid>',view_func=login,endpoint="sb",methods=['POST',"GET"])

  2.路由的传参:

  在rule中,可以通过以下方式传入参数,传入的参数会变成对应的类型:

app.add_url_rule('/login/<string:nid>',view_func=login,endpoint="sb",methods=['POST',"GET"])

  转换器还有以下类型:

DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}

六。cbv的分析

  在调用cbv的视图函数的时候,基本形式如下:

class loginview(views.View):
# def dispatch_request(self):
def dispatch_request(self,*args,**kwargs):
print('')
print(args)
print(kwargs)
return '' app.add_url_rule('/login',view_func=loginview.as_view(name='login'))

  每个视图函数中都需要走as_view函数,如果没有name参数,所有的视图类函数都将以view命名,难以区分,所以这里的name也相当于endpoint。

  decorators

  这个参数代表的是装饰器,可以将齐总的装饰器都装饰到view函数中。

  如果没有decorators,则进行以下步骤:

  将,methods传给类对象,将本类定义到view_class,最后给view执行。

  执行的结果还是运行本类中的dispatch_request,这个函数只有在自定义的类中定义。

七。cbv分发url类型。

  如何将flask中的cbv像django中的一样,可以针对不同的请求方式执行对应的函数。

  首先lei继承自MethodView:

  通过全局的配置request中读取获取数据的方法,再从本类中反射,执行该语句。:

class loginview(views.MethodView):
def get(self):
dict1 = {
'name':'lzx',
'age':'',
'add':'shanghai'
}
return render_template('login.html',name='lzx',name_dict=dict1) def post(self):
dict1 = {
'name':'lzx'
}
return render_template('login.html',name='lzx',name_dict=dict1)

  这时候就不能写dispatch_request函数了。

day89_11_11Flask启动,配置,路由,fbv和cbv的更多相关文章

  1. 一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.

    一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境 ...

  2. python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统

    一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher. ...

  3. Flask 的路由系统 FBV 与 CBV

    Flask的路由系统 本质: 带参数的装饰器 传递函数后 执行 add_url_rule 方法 将 函数 和 url 封装到一个 Rule对象 将Rule对象 添加到 app.url_map(Map对 ...

  4. Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)

    摘要: 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页.虚拟环境 视图层 JsonResponse FBV 与 CBV(function base views与class bas ...

  5. django之路由分组,路由分发,FBV,CBV,ORM框架

    今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...

  6. Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数

    一.FBV和CBV 在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view ...

  7. [Python自学] day-19 (1) (FBV和CBV、路由系统)

    一.获取表单提交的数据 在 [Python自学] day-18 (2) (MTV架构.Django框架)中,我们使用过以下方式来获取表单数据: user = request.POST.get('use ...

  8. django请求生命周期,FBV和CBV,ORM拾遗,Git

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

  9. python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)

    一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...

  10. day54_9_18视图层某内部原理(fbv和cbv)与模板层

    一.render内部原理. 在render中往往需要返回三个参数,request,模板和一些键值对. 键值对中存储的是需要对模板渲染的值. 如果手动实现可以如下: from django.templa ...

随机推荐

  1. MySQL的表定义语法

    表定义 只有成功创建数据库后,才能创建数据表,数据表是字段的集合,在表中数据按行和列的格式存储 创建表 MySQL 使用 CREATE TABLE 创建表.其中有多个选择,主要由表创建定义(creat ...

  2. Tesseract.js 一个几乎能识别出图片中所有语言的JS库

    Tesseract.js 一个几乎能识别出图片中所有语言的JS库. 官网:http://tesseract.projectnaptha.com/ git:https://github.com/napt ...

  3. My97DatePicker-WdatePicker日历日期插件详细示例

    <!DOCTYPE html> <html> <head> <title>排行</title> <meta charset=" ...

  4. Chrome是老大,Firefox 是老二,Edge 不是老三

    NetMarketShare 是全球最大的电子消费市场调研机构,根据 NetMarketShare 提供的统计数据显示,来自七月份的报告,谷歌的 Chrome 在全球台式浏览器排名上仍居榜首,该公司保 ...

  5. springboot 2.0+整合RabbitMQ

    基于spring-boot 2.* 作用: 1.异步处理 2.应用解耦 3.流量削峰   相关概念介绍: Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指 ...

  6. avd manger创建的虚拟机启动不起来,或者启动起来后黑屏

    最近鼓捣安卓虚拟机,整的都差点重装系统,刚开始下载了genymotion_vbox,装完以后要在vbox中导入一个虚拟机,结果我导入完,虚拟机怎么也启动不了,然后各种找办法无果,最后重启电脑发现电脑也 ...

  7. 【tf.keras】tensorflow datasets,tfds

    一些最常用的数据集如 MNIST.Fashion MNIST.cifar10/100 在 tf.keras.datasets 中就能找到,但对于其它也常用的数据集如 SVHN.Caltech101,t ...

  8. PHP如何开启swoole扩展

    swoole是一个PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncT ...

  9. mjml - 如何快速编写响应式电子邮件?

    一.背景 以前做项目碰到发邮件的需求,邮件模板的编辑就是一件头疼的事.因为虽说邮件是支持 HTML 的,但是确是 HTML 子集程度的支持,所以存在必须通过 <table> 排版的恶心之处 ...

  10. go语言的常量

    Go 语言常量 常量是一个简单值的标识符,在程序运行时,不会被修改的量. 常量中的数据类型只可以是布尔型.数字型(整数型.浮点型和复数)和字符串型. 常量的定义格式: const identifier ...