Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSIG工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

一、安装及其使用

pip install flask
 from flask import Flask
app = Flask(__name__) @app.route('/index')
def index():
return 'Hello Flask' if __name__ == '__mian__':
app.run()

二、配置文件

flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为:
{
'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,
}

配置文件

from flask import Flask

app = Flask(__name__)
app.config.from_object('settings.BaseConfig')
class BaseConfig(object):
DEBUG = True
SECRET_KEY = 'dfaf3432iojjklfvndj=' class ProductionConfig(BaseConfig):
DEBUG = False

settings

三、路由系统

在上面一个简单的例子中我们使用了无传参的url和Django类似在url中也可以进行传参

app.route('/index/<username>')        #默认传参类型为str
app.route('/index/<int:post_id>') #类型为整型传参
app.route('/index/<float:post_id>') #类型为浮点型传参
app.route('/index/<path:path>') #类型是一个路径
app.route('/login', methods=['GET', 'POST']) #默认只get请求,这样就添加了POST请求

上面的路由都是根据下面的配置来进行解析的

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

对应配置

路由的反向解析:url_for

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/index')
def index():
v1 = url_for('login')
v2 = url_for('user')
print(v1, v2)
return 'ok' @app.route('/login', methods=['GET', 'POST'], endpoint='login')
def login():
return '登录页面' @app.route('/user', methods=['GET', 'POST'], endpoint='user')
def user():
return '用户界面' if __name__ == '__main__':
app.run()

url_for反向解析

自定义URL匹配正则表达式:

from flask import Flask, render_template, redirect, url_for
from werkzeug.routing import BaseConverter
app = Flask(__name__) class RegexConverter(BaseConverter):
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex def to_python(self, value):
return value def to_url(self, value):
val = super(RegexConverter, self).to_url(value)
return val app.url_map.converters['xxx'] = RegexConverter @app.route('/index/<xxx("\w+"):nid>', methods=['GET', 'POST'], endpoint='index')
def index(nid):
print(nid, type(nid))
v = url_for('index', nid=999)
return 'Index' if __name__ == '__main__':
app.run()

自定义正则

重定向功能:

from flask import Flask,render_template,redirect
app = Flask(__name__) @app.route('/index',methods=['GET','POST'],redirect_to='/new')
def index():
return "老功能" @app.route('/new',methods=['GET','POST'])
def new():
return '新功能' if __name__ == '__main__':
app.run()

redirect_to

子域名

from flask import Flask,render_template,redirect
app = Flask(__name__)
app.config['SERVER_NAME'] = 'oldboy.com:5000' @app.route("/dynamic", subdomain="<username>")
def xxxxxxx(username):
print(username)
return 'xxxxx' if __name__ == '__main__':
app.run()

在flask中注册路由大致有两种方式FBV,CBV

 #FBV有两种方式
#第一种装饰器来注册
@app.route('/index', methods=['GET'])
def index():
return 'Hello Flask!' #第二种注册方式
def index():
return 'Hello Flask!' app.add_url_rule('/index', view_func=index)

FBV

from Flask import views

def auth(func):
def inner(*args, **kwargs):
print('之前做的')
ret = func(*args, **kwargs)
print('之后做的')
return ret
return inner class IndexView(views.MethodView):
methods = ['GET']
decorators = [auth,] def get(self):
return '这是GET方法!' def post(self):
return '这是POST方法!' app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) #name为endpoint

CBV

注册url方法中的参数

@app.route和app.add_url_rule参数:
rule, URL规则
view_func, 视图函数名称
defaults=None, 默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数
endpoint=None, 名称,用于反向生成URL,即: url_for('名称')
methods=None, 允许的请求方式,如:["GET","POST"] strict_slashes=None, 对URL最后的 / 符号是否严格要求,
如:
@app.route('/index',strict_slashes=False),
访问 http://www.xx.com/index/ 或 http://www.xx.com/index均可
@app.route('/index',strict_slashes=True)
仅访问 http://www.xx.com/index
redirect_to=None, 重定向到指定地址
如:
@app.route('/index/<int:nid>', redirect_to='/home/<nid>')

def func(adapter, nid):
return "/home/888"
@app.route('/index/<int:nid>', redirect_to=func)
subdomain=None, 子域名访问
from flask import Flask, views, url_for app = Flask(import_name=__name__)
app.config['SERVER_NAME'] = 'wupeiqi.com:5000' @app.route("/", subdomain="admin")
def static_index():
"""Flask supports static subdomains
This is available at static.your-domain.tld"""
return "static.your-domain.tld" @app.route("/dynamic", subdomain="<username>")
def username_index(username):
"""Dynamic subdomains are also supported
Try going to user1.your-domain.tld/dynamic"""
return username + ".your-domain.tld" if __name__ == '__main__':
app.run() 注册url参数

url参数

四、请求和相应

from flask import Flask
from flask import request
from flask import render_template
from flask import redirect
from flask import make_response app = Flask(__name__) @app.route('/login.html', methods=['GET', "POST"])
def login(): # 请求相关信息
# request.method # 当前请求的方法(POST,GET)
# request.args # GET方法传来的数据一个Multidict类型
# request.form # POST方法传来的数据一个Multidict类型
# request.values # GET, POST数据都在其中
# request.cookies # 可以去到cookie中的数据
# request.headers #
# 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)) # 响应相关信息
# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html') # response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response return "内容" if __name__ == '__main__':
app.run()

request请求方法

return ""
return json.dumps({}) # return jsonify({})
return render_template('index.html',n1=123)
return redirect('/index') # response = make_response(render_template('index.html'))
# response = make_response("xxxx")
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# response.delete_cookie('key')
# return response

响应相关

五、闪现

from flask import Flask,session,flash,get_flashed_messages
app = Flask(__name__)
app.secret_key = 'asdfasdfasdf' @app.route('/x1',methods=['GET','POST'])
def login():
flash('我要上向龙1',category='x1')
flash('我要上向龙2',category='x2')
return "视图函数x1" @app.route('/x2',methods=['GET','POST'])
def index():
data = get_flashed_messages(category_filter=['x1'])
print(data)
return "视图函数x2" if __name__ == '__main__':
app.run()

存储的时候flash贴上标签,然后可以根据标签来取值

Flask初见的更多相关文章

  1. Flask:初见

    Windows 10家庭中文版,Python 3.6.4 从Flask官网开始学起. 介绍 Flask是一个Python的Web开发微框架,基于Werkzeug.Jinja2模块(and good i ...

  2. Flask+pin

    Flask+SSTI的新火花 记一次buu刷题记和回顾祥云杯被虐出屎的经历.题目:[GYCTF2020]FlaskApp 一 题目初见 朴实无华的页面,一个base64的小程序页面 看到有提示. 我就 ...

  3. flask+sqlite3+echarts2+ajax数据可视化

    前提: 准备Python + Flask+Sqlite3的平台环境(windows系统) 前面一节介绍flask怎么安装了,剩下sqlite3下载后解压,然后环境变量添加解压路径就行了 附加下载地址: ...

  4. flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法

    flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...

  5. Windows下快速安装Flask的一次经历

    前提: 1.已安装python版本(一般都是2.X) 2.已安装easy_install python安装,记得配置Python的环境变量,例如:我的直接在Path上加 G:\Python 验证安装P ...

  6. 使用Flask设计带认证token的RESTful API接口[翻译]

    上一篇文章, 使用python的Flask实现一个RESTful API服务器端  简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...

  7. 使用python的Flask实现一个RESTful API服务器端[翻译]

    最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...

  8. python flask (一)

    from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World ...

  9. flask源码分析

    本flask源码分析不间断更新 而且我分析的源码全是我个人觉得是很beautiful的 1 flask-login 1.1 flask.ext.login.login_required(func),下 ...

随机推荐

  1. bat 日期格式设置

    转自:http://hi.baidu.com/awillaway/item/c61f964dc238190ce935044d   日期可以用扩展表示方法,你在cmd运行以下几个命令就明白了: echo ...

  2. 如何将bug杀死在摇篮里?

    阿里妹导读:在欧洲中世纪的传说中,有一种叫“人狼”的妖怪,就是人面狼身.它们会讲人话,专在月圆之夜去袭击人类.而且传说中对“人狼”用一般的枪弹是不起作用的,普通子弹都伤不到也打不死它,只有一种用银子作 ...

  3. solidity语言10

    pragma solidity ^0.4.16; contract OwnedToken { // TokenCreator是个合约类型,由后面部分定义.只要不用于创建新合约,引用它就好 TokenC ...

  4. 本地数据库(sql server)插入一条新数据时,同步到服务器数据库

    之前有个同学问我,本地数据库插入新数据时怎么同步到服务器上,当时我先想到是程序逻辑控制,作相应的处理. 但有时候我们程序不太好处理,那能不能从数据库入手呢,数据库不是有触发器(Trigger)吗,应该 ...

  5. Flask博客类登录注册验证模块代码(十四)

    1 文件系统 blog #博客类 App forms #表单 __init__.py user.py models #模型 __init__.py user.py static #静态文件 templ ...

  6. Linux文件压缩和解压缩命令

    Linux文件压缩和解压缩命令: tar 命令(打包并压缩的话,原文件也会默认存在) -c 建立打包档案 -x 解包 -t 查看包里的类容 -r 向包里追加文件 -v 显示打包过程 -f 文件 比如: ...

  7. C++ cin不支持录入空格

    如果在C++中,用cin>>str;这种方法来接收字符串那么录入的str不能包含空格,否则它会按照空格将整个字符串切分成若干段.如果你要是想输入带空格的字符串那就要用到getline()这 ...

  8. hdu-1492 The number of divisors(约数) about Humble Numbers---因子数公式

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1492 题目大意: 给出一个数,因子只有2 3 5 7,求这个数的因子个数 解题思路: 直接求出指数即 ...

  9. JavaScript闭包简单学习

    因为实验室项目要用,所以最近在学习OpenLayers,但是从来没有做过前端呀,坑爹的,硬着头皮上吧 反正正好借这个机会学习一下JS,本来对这门语言也挺感兴趣的,多多少少写过一下JS代码了,差不多学一 ...

  10. apache开启.htaccess及使用方法

    1 . 如何让的本地APACHE器.htaccess 如何让的本地APACHE呢?其实只要简朴修改一下apache的httpd.conf设置就让APACHE.htaccess开启了,来看看操作 打开h ...