安装flask

pip3 install flask

短小精悍、可扩展强 的一个Web框架。

牛逼点:上下文管理机制

依赖wsgi:

   werkzeug(相当于Django的wsgi):只要安装flask,就有werkzeug了。

底层实现一:
from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple
请求进来--------------------- def run(environ,start_response): return [b"asdfasdf"] 返回 if __name__ == '__main__':
监听4000端口 run_simple('localhost', 4000, run) 底层实现二: from werkzeug.wrappers import Request, Response @Request.application
def hello(request):
response对象也可以
return Response('Hello World!') if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, hello)

备注:

flask源码入口

Flask源码入口:
from werkzeug.wrappers import Response
from werkzeug.serving import run_simple class Flask(object):
def __call__(self,environ, start_response):
response = Response('hello')
return response(environ, start_response) def run(self):
run_simple('127.0.0.1', 8000, self)
app = Flask() if __name__ == '__main__':
app.run()
class Foo(object):

    def __init__(self):
print('sdfsdf') def __call__(self, *args, **kwargs):
print('call') 类+()执行__init__方法
obj = Foo() 类+()执行__call__方法
obj()

简单使用:

from flask import Flask
步骤1实例化flask---------------
app = Flask(__name__) 步骤2视图函数------------------
@app.route('/index')
def index():
return "Hello World" 步骤3运行---------------------------
if __name__ == '__main__':
app.run()

给你一个路径 ,获取类并获取其中的大写的静态字段

给你一个路径 “settings.Foo”,可以找到类并获取去其中的大写的静态字段。

settings.py文件
class Foo:
DEBUG = True
TEST = True xx.py 文件
import importlib path = "settings.Foo" p,c = path.rsplit('.',maxsplit=1)
m = importlib.import_module(p)
cls = getattr(m,c) # 如果找到这个类?
for key in dir(cls):
if key.isupper():
print(key,getattr(cls,key))

flask系统组件:

1. 配置文件

app.py:

        app.config.from_object("settings.DevelopmentConfig")

        settings.py:
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

2. 路由系统

自定义装饰器放下面

  • @app.route('/user/<username>'):不加类型是字符串
  • @app.route('/post/<int:post_id>')整型
  • @app.route('/post/<float:post_id>')小数
  • @app.route('/post/<path:path>')路径
  • @app.route('/login', methods=['GET', 'POST'])方法
  • 自定义正则
1:无参数的反向解析:--------------------------------------------
  导入url_for,指定endpoint名字,
    不指定:默认是函数名
    重名:项目无法启动
from flask import Flask,url_for

app=Flask(__name__)

@app.route('/indexaaaaa',methods=['GET','POST'],endpoint='n1')
def index():
print(url_for('n1'))
return 'Index' if __name__ == '__main__':
app.run() 2:有参数的反向解析:----------------------------------------------------
from flask import Flask,url_for

app=Flask(__name__)

@app.route('/index/<int:nid>',methods=['GET','POST'],endpoint='n1')
def index(nid):
print(url_for('n1',nid=666))反向解析有参解析
return 'Index' if __name__ == '__main__':
app.run()
 
from werkzeug.routing import BaseConverter
from flask import Flask,url_for app = Flask(__name__) class RegexConverter(BaseConverter):
""" 自定义URL匹配正则表达式
"""
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
:param value:
:return:
"""
return int(value) def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
:param value:
:return:
"""
val = super(RegexConverter, self).to_url(value)
return val # 步骤二:添加到转换器
app.url_map.converters['reg'] = RegexConverter """
1. 用户发送请求
2. flask内部进行正则匹配
3. 调用to_python(正则匹配的结果)方法
4. to_python方法的返回值会交给视图函数的参数 """ # 步骤三:使用自定义正则
@app.route('/index/<reg("\d+"):nid>')
def index(nid):
print(nid, type(nid)) print(url_for('index', nid=987))
return "index" if __name__ == '__main__':
app.run()

自定义正则表达式

3. 视图

FBV(基于函数的)

CBV(基于类的)

第一步导入views
from flask import Flask,views
第六步添加配置信息(不写则没有注释文件)
import functools app = Flask(__name__) def wrapper(func):
第七步应用配置信息类
@functools.wraps(func):切记加上,否则被装饰的函数都成inner了。
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner 第二步定制一个类,继承views.MethodView类
class UserView(views.MethodView):
methods = ['GET']
# 给CBV加装饰器
decorators = [wrapper,]
def get(self,*args,**kwargs):
return 'GET'
def post(self,*args,**kwargs):
return 'POST' 第三步:给函数添加路由
app.add_url_rule('/user',None,UserView.as_view('uuu')) if __name__ == '__main__':
第四步执行函数
app.run()

4. 请求相关

from flask import Flask,render_template,request,redirect,url_forapp = Flask(__name__)

@app.route('/login',methods=['GET','POST'])
def login(): # 请求相关信息
常用方法
 
 # request.method
  
  # request.form
  # request.cookies
  # request.headers
 
# request.args

# request.values
# request.path
# request.full_path
# request.script_root
# request.url
# request.base_url
# request.url_root
# request.host_url
# request.host 上传文件
# request.files
# obj = request.files['the_file_name']
保存路径
# obj.save('/var/www/uploads/' + secure_filename(f.filename))

5. 响应   

from flask import Flask,jsonify

响应体:
  return “asdf”

  return jsonify({'k1':'v1'}):返回json数据
  return render_template('xxx.html')
  return redirect()

定制响应头:
  obj = make_response("asdf")
  obj.headers['xxxxxxx'] = '123'
  obj.set_cookie('key', 'value')
  return obj

6. 模板渲染

- 基本数据类型:
    可以执行python语法,如:dict.get() list['xx']
- 传入函数
- django,自动执行
- flask,不自动执行
---------------------------------------------------------------------------
- 全局定义函数(自定义方法),定义之后模板可以直接进行渲染
py文件定义: @app.template_global()
       def sb(a1, a2):
       return a1 + a2
       模板使用:{{sb(1,9)}}
-------------------------------------------------------------------------------

            @app.template_filter()
def db(a1, a2, a3):
# {{ 1|db(2,3) }}
return a1 + a2 + a3
        模板中使用:{{1|db(2,3)}}
          备注:1第一个参数存入,2第二个参数传入,3第三个参数传入
      
---------------------------------------------------------------------------------
- 模板继承
layout.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>模板</h1>
{% block content %}{% endblock %}
</body>
</html> tpl.html
{% extends "layout.html"%} {% block content %}
{{users.0}} {% endblock %}
-------------------------------------------------------------------------------------------------
- include {% include "form.html" %} form.html
<form>
asdfasdf
asdfasdf
asdf
asdf
</form>
------------------------------------------------------------------------------------------------
- 宏
{% macro ccccc(name, type='text', value='') %}
<h1>宏</h1>
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="submit" value="提交">
{% endmacro %} {{ ccccc('n1') }} {{ ccccc('n2') }}
------------------------------------------------------------------------------------------------------------- - 安全
- 前端: {{u|safe}}
- 前端: MarkUp("asdf")


7. session

加密后放置在用户浏览器的cookie中。
- 流程:
- 请求到来
- 视图函数
- 请求结束

当请求刚到来:flask读取cookie中session对应的值:eyJrMiI6NDU2LCJ1c2VyIjoib2xkYm95,将该值解密并反序列化成字典,
放入内存以便视图函数使用。
视图函数:
@app.route('/ses')
def ses():
session['k1'] = 123
session['k2'] = 456
del session['k1'] return "Session" session['xxx'] = 123
session['xxx'] 当请求结束时,flask会读取内存中字典的值,进行序列化+加密,写入到用户cookie中。

8. 闪现

在session中存储一个数据,读取时通过pop将数据移除。只能读取一次
from flask import Flask,flash,get_flashed_messages
@app.route('/page1')
def page1(): flash('临时数据存储','error')
flash('sdfsdf234234','error')
flash('adasdfasdf','info') return "Session" @app.route('/page2')
def page2():
print(get_flashed_messages(category_filter=['error']))
return "Session"       
 

9. 中间件

- call方法什么时候触发?
- 用户发起请求时,才执行。
- 任务:在执行call方法之前,做一个操作,call方法执行之后做一个操作。
class Middleware(object):
def __init__(self,old):
self.old = old def __call__(self, *args, **kwargs):
ret = self.old(*args, **kwargs)
return ret if __name__ == '__main__':
app.wsgi_app = Middleware(app.wsgi_app)
app.run()

10. 特殊装饰器

     1. before_request(请求之前执行)

        2. after_request(请求之后执行)

            示例:
from flask import Flask
app = Flask(__name__) @app.before_request
def x1():
print('before:x1')
return '滚' @app.before_request
def xx1():
print('before:xx1') @app.after_request
def x2(response):
print('after:x2')
return response @app.after_request
def xx2(response):
print('after:xx2')
return response @app.route('/index')
def index():
print('index')
return "Index" @app.route('/order')
def order():
print('order')
return "order" if __name__ == '__main__': app.run() 3. before_first_request(第一次访问时执行,再次访问不执行) from flask import Flask
app = Flask(__name__) @app.before_first_request
def x1():
print('') @app.route('/index')
def index():
print('index')
return "Index" @app.route('/order')
def order():
print('order')
return "order" if __name__ == '__main__': app.run() 给模板用的(在py文件中自定义的方法):
  4. template_global   5. template_filter 6. errorhandler(没找到网页时定制信息,如显示企业广告或失联儿童等)
@app.errorhandler(404)
def not_found(arg):
print(arg)
return "没找到"

11.蓝图(flask目录结构)

文件结构点击下载

flask介绍的更多相关文章

  1. python的Flask 介绍

    Flask 介绍 知识点 微框架.WSGI.模板引擎概念 使用 Flask 做 web 应用 模板的使用 根据 URL 返回特定网页 实验步骤 1. 什么是 Flask? Flask 是一个 web ...

  2. Flask学习【第1篇】:Flask介绍

    Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是So ...

  3. Flask【第1篇】:Flask介绍

    Flask入门 一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Wer ...

  4. python三大框架之一(flask介绍)

    Flask , Django,  Tornado 是python中常用的框架,也是python的三大框架.它们的区别是:Flask: 轻量级框架: Django:重量级框架: Tornado:性能最好 ...

  5. Python3基础教程(二十)—— flask介绍

    基本概念 什么是Flask? Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 web 应用程序可以是一些 web 页面.博客.w ...

  6. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  7. Flask介绍及简单使用

    Flask Django是一个大而全的框架,Flask是一个轻量级的框架. 区别: Django内部集成了大量的组件:请求处理是逐一封装和传递: Flask本身并没有太多的功能,但是第三方组件非常丰富 ...

  8. 一、Flask路由介绍

    Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是So ...

  9. Flask 学习(一)简单介绍

    Flask介绍(轻量级的框架) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收ht ...

随机推荐

  1. SpringBoot进阶用法-随笔

    SpringBoot进阶用法 实现setApplicationContext //实现ApplicationContextAware接口,重写setApplicationContext方法 publi ...

  2. phpqrcode实现二维码(含图片)

    ---恢复内容开始--- 1,http://phpqrcode.sourceforge.net/ 下载 2,解压以后只需要一个文件 3,原生php测试: <?php include 'phpqr ...

  3. Android进程管理

    1.进程按照优先级分为不同的等级FVSBE Foreground process前台进程:用户可看到进程里某个activity界面(可以获得焦点的) Visible process可见进程:用户仍可见 ...

  4. Java多线程(一)初步了解

    1:线程 1.1:线程是什么?线程与进程. 进程:正在运行的程序.windows是多进程的系统.每一个进程有自己的内存区域,也就是每个进程都会占用一定的内存.一般打开应用程序就会有进程的了. 线程:进 ...

  5. JavaScript设计模式-10.工厂模式实例xhr

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. ognl,jstl,struts2标签中符号#,$,%的用法

    STRUTS2标签操作Map <s:iterator value="sundayMap">           <td colspan="7" ...

  7. 多线程并发问题解决之redis锁

    一 问题背景 我们做的是医疗信息化系统,在系统中一条患者信息对医院中当前科室中的所有诊断医生是可见的,当有一个诊断医生点击按钮处理该数据时,数据的状态发生了变化,其他的医生就不可以再处理此患者的数据了 ...

  8. 设置主外键时 ORA-02298: 无法验证 - 未找到父项关键字 --NOVALIDATE;

    主要原因是: 在添加CONSTRAINT的时候,默认是需要VALIDATE表中的已有数据的. 你要插入的表A里,有外键连接到另一个表B的主键,你在表A的外键列插入的值,在表B的主键列找不到就不能插入. ...

  9. Netty(1):第一个netty程序

    为什么选择Netty netty是业界最流行的NIO框架之一,它的健壮型,功能,性能,可定制性和可扩展性都是首屈一指的,Hadoop的RPC框架Avro就使用了netty作为底层的通信框架,此外net ...

  10. pureMVC与strangeIoc框架对比

    前言 最近有机会了解到了StrangeIoc框架,就拿来跟自己比较熟悉的pureMVC进行一下简要的对比.这两套开源框架都是基于MVC模式的扩展,pureMVC是一个跨平台跨语言的MVC轻量级应用框架 ...