一。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. Image 缩略图

    方法一:通过调用Image对象的自带方法GetThumbnailImage()进行图片转换. /// <summary> /// 生成缩略图重载方法,返回缩略图的Image对象 /// & ...

  2. .Net Core 使用 NPOI 导入Excel

    由于之前在网上查阅一些资料发现总是不能编译通过,不能正常使用,现把能正常使用的代码贴出: /// <summary> /// Excel导入帮助类 /// </summary> ...

  3. bootstrap-table 常用总结-树形结构(展开和折叠)

    今天在工作的时候,遇到了一个需求,就是需要一键展开或者关闭树形结构.关于树形结构的不是很熟悉,然后去百度,结果也不是很准确.最后经过Google才找到.下面分享给大家 直接看代码: var flag ...

  4. DSP编程与调试总结

    (1)error: can't allocate .ebss, size 000c450d (page 1) in DXINTFRAM2 (avail: 00010000) error: errors ...

  5. enable user-defined extended attributes for ext3 file systems; 增加ext3 文件系统的扩展属性;

    To enable user-defined extended attributes for ext3 file systems (i.e. device), use: tune2fs -o user ...

  6. centos和Ubuntu系统最小化安装基础命令

    CentOS系统常用的基础软件如下 yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre \ pcre-devel openssl o ...

  7. gunicorn Python部署应用

    对于flask应用 启动命令为 python app.py 使用gunicorn启动 pip install gunicorn python gunicorn --workers=7 switch_a ...

  8. 关于强制IE不使用兼容模式渲染网页

    现在IE11是唯一受微软支持的IE浏览器. IE11有兼容模式,开启后有网页会出错. 在html header标签下加上 <meta http-equiv="X-UA-Compatib ...

  9. js 生成32位随机数,可用于微信支付流水号(前端生成)

    $(function () { /*生成32位随机流水号*/ /*默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1*/ var $chars = 'ABCDEFGHJKMNPQRSTWXYZ ...

  10. Spring Boot可执行Jar包运行原理

    目录 1. 打可执行Jar包 2. 可执行Jar包内部结构 3. JarLauncher 4. 简单总结 5. 远程调试 Spring Boot有一个很方便的功能就是可以将应用打成可执行的Jar.那么 ...