day89_11_11Flask启动,配置,路由,fbv和cbv
一。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的更多相关文章
- 一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.
一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境 ...
- python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统
一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher. ...
- Flask 的路由系统 FBV 与 CBV
Flask的路由系统 本质: 带参数的装饰器 传递函数后 执行 add_url_rule 方法 将 函数 和 url 封装到一个 Rule对象 将Rule对象 添加到 app.url_map(Map对 ...
- Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)
摘要: 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页.虚拟环境 视图层 JsonResponse FBV 与 CBV(function base views与class bas ...
- django之路由分组,路由分发,FBV,CBV,ORM框架
今日的内容: a. 路由系统 1. 创建app 2. 路由的分组 3. 路由的分发 - 正则表达式匹配 b. django的orm(模型model) 1. 创建模型的步骤 2. orm基本的增删改查 ...
- Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数
一.FBV和CBV 在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view ...
- [Python自学] day-19 (1) (FBV和CBV、路由系统)
一.获取表单提交的数据 在 [Python自学] day-18 (2) (MTV架构.Django框架)中,我们使用过以下方式来获取表单数据: user = request.POST.get('use ...
- django请求生命周期,FBV和CBV,ORM拾遗,Git
一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...
- python 全栈开发,Day84(django请求生命周期,FBV和CBV,ORM拾遗,Git)
一.django 请求生命周期 流程图: 1. 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post, ...
- day54_9_18视图层某内部原理(fbv和cbv)与模板层
一.render内部原理. 在render中往往需要返回三个参数,request,模板和一些键值对. 键值对中存储的是需要对模板渲染的值. 如果手动实现可以如下: from django.templa ...
随机推荐
- asp.net MVC 在Controller控制器中实现验证码输出
asp.net mvc项目使用到验证码,为了让以前的WebForm代码能利用上代码经过稍微的改动即可使用代码如下: using System; using System.Collections.Gen ...
- Spring Boot 2.2.2.RELEASE 版本中文参考文档【3.1】
使用Spring Boot 本节将详细介绍如何使用Spring Boot.它涵盖了诸如构建系统,自动配置以及如何运行应用程序之类的主题.我们还将介绍一些Spring Boot最佳实践.尽管Spring ...
- bootstrap-table 常用总结-1
两种表格工具,今天都用到了,一种是我前几篇写到过的jqgrid,(传送门)另一个就是bootstrap-table了.用过之后会发现,两种表格的方式大同小异,但是为什么这次要换成bootstrap-t ...
- React 基础笔记
概览 React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript库.可以将一些简短.独立的代码片段组合成复杂的UI界面,这些片段被称为"组件". React 大 ...
- 网页添加Live2D看板娘简易教程
看板娘是一种职业和习惯称呼,也是ACGN次文化中的萌属性之一.简而言之就是小店的女服务生,也有“吸引顾客,招揽生意,提高人气”等作用类似品牌形象代言人的含义. 如果想在自己的博客上放一个呆萌的看板娘非 ...
- simple go web application & 二维码生成 & 打包部署
go语言简易web应用 & 二维码生成及解码 & 打包部署 转载请注明出处: https://www.cnblogs.com/funnyzpc/p/10801476.html 前言(闲 ...
- 2、netty第一个例子,简单的http服务器
用netty来启动一个简单的可处理http请求的服务器. 依照前面写的使用netty的过程.贴上代码 server import io.netty.bootstrap.ServerBootstrap; ...
- SQLSERVER预读逻辑读物理读
预读:用估计信息,去硬盘读取数据到缓存.预读100次,也就是估计将要从硬盘中读取了100页数据到缓存. 物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读硬盘.物理读10页,从硬盘中 ...
- Redis安装部署以及简单应用
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(list ...
- QT Creator: The process could not be started!
如果往工程里面增加了uac.manifest 文件后,QT creator不通过管理员启动的话,若要debug程序的话,就会提示 “The process could not be started!” ...