基本使用

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

配置文件

在app 中引入

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

settings

class BaseConfig(object):
DEBUG = True
SECRET_KEY = "随机字符串" class ProductionConfig(BaseConfig):
DEBUG = False class DevelopmentConfig(BaseConfig):
pass class TestingConfig(BaseConfig):
pass

路由

a. 添加路由的两种方式:
from flask import Flask,render_template,redirect
app = Flask(__name__) """
1. 执行decorator=app.route('/index',methods=['GET','POST'])
2. @decorator
- decorator(index)
"""
# 路由方式一(*):
@app.route('/index',methods=['GET','POST'])
def index():
return "Index" # 路由方式二:
def order():
return 'Order' app.add_url_rule('/order',view_func=order) if __name__ == '__main__':
app.run()
b. endpoint(默认函数名)
c. 传参数
@app.route('/index/<int:nid>',methods=['GET','POST'])
def index(nid):
print(nid,type(nid)) url_for('index',nid=888) return "Index"
d. 自定义正则参数 from flask import Flask,render_template,redirect,url_for
from werkzeug.routing import BaseConverter
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['xxx'] = RegexConverter @app.route('/index/<xxx("\d+"):nid>',methods=['GET','POST'])
def index(nid):
print(nid,type(nid))
v = url_for('index',nid=999) # /index/999
print(v)
return "Index" if __name__ == '__main__':
app.run() e. 其他参数
- 重定向
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() PS: 前端重定向
- meta/js 重点:
- url
- methods
- endpoint
- @app.route('/index/<int:nid1>/<int:nid2>/')
- url_for

视图函数

fbv(常用)

import functools

def wapper(func):
@functools.wraps(func)
def inner(*args,**kwargs):
print('before')
return func(*args,**kwargs)
return inner @app.route('/xxxx',methods=['GET','POST'])
@wapper
def index():
return "Index"

cbv

class IndexView(views.MethodView):
methods = ['GET']
decorators = [wapper, ] def get(self):
return 'Index.GET' def post(self):
return 'Index.POST' app.add_url_rule('/index', view_func=IndexView.as_view(name='index2')) # name=endpoint

请求和响应

请求相关

request.method
request.args
request.form
request.cookies
request.headers
request.path
request.files obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(obj.filename)) request.values
request.full_path
request.script_root
request.url
request.base_url
request.url_root
request.host_url
request.host

响应相关

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

模板

调用方法基本和Django相同

session

  • 设置:session['username'] = 'xxx'
  • 删除:session.pop('username', None)

蓝图(Blueprint)

目录结构



manage.py

from s8pro import app

if __name__ == '__main__':
app.run()

init.py

from flask import Flask
from .views import account
from .views import admin
from .views import user app = Flask(__name__) app.register_blueprint(account.ac)
app.register_blueprint(admin.ad)
app.register_blueprint(user.us)

views 文件夹内

1.account.py

from flask import Blueprint,render_template
import redis ac = Blueprint('ac',__name__) @ac.route('/login')
def login():
conn = redis.Redis()
return render_template('login.html') @ac.route('/logout')
def logout():
return '退出'

2.admin.py

from flask import Blueprint

ad = Blueprint('ad',__name__,url_prefix='/admin')

@ad.before_request
def bf():
print('before_request') @ad.route('/home')
def home():
return 'home' @ad.route('/xxxx')
def xxxx():
return 'xxxx'

3.user.py

from flask import Blueprint

us = Blueprint('us',__name__)

@us.route('/info')
def info():
return 'info'

前缀和子域名

蓝图URL前缀:xxx = Blueprint('account', __name__,url_prefix='/xxx')
蓝图子域名:xxx = Blueprint('account', __name__,subdomain='admin')
# 前提需要给配置SERVER_NAME: app.config['SERVER_NAME'] = 'xxx.com:5000'
# 访问时:admin.xxx.com:5000/login.html

闪现(message)

message是一个基于Session实现的用于保存数据的集合
其特点是:使用一次就删除。
@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"

中间件

class Middleware(object):
def __init__(self,old_wsgi_app):
"""
服务端启动时,自动执行
:param old_wsgi_app:
"""
self.old_wsgi_app =old_wsgi_app def __call__(self, environ, start_response):
"""
每次有用户请求道来时
:param args:
:param kwargs:
:return:
"""
print('before')
from flask import session,request
obj = self.old_wsgi_app(environ, start_response)
print('after')
return obj if __name__ == '__main__':
app.wsgi_app = Middleware(app.wsgi_app)
app.run()
"""
1.执行app.__call__
2.再调用app.wsgi_app方法
"""

常见装饰器

@app.before_request         每次请求进来之前执行
@app.after_request 每次请求进来之后执行
@app.errorhandler(404) 引发404错误时候执行
@app.before_first_request 第一次请求进来之前执行(如创建数据库连接池这样的业务)
@app.template_global() 调用方法{{函数名(参数1,参数2)}}
@app.template_filter() 调用方法{{参数1|函数名(参数2,参数3))}}

Flask 通关攻略大全的更多相关文章

  1. imToken 测评通关攻略

    imToken 测评通关攻略 2017-10-19 imToken 在 1.3.3 版本新增了用户风险测评系统, 目的是为了让更多的用户了解钱包安全知识以及区块链的基本概念, 从某种程度上提升了整个区 ...

  2. Upload-labs 文件上传靶场通关攻略(上)

    Upload-labs 文件上传靶场通关攻略(上) 文件上传是Web网页中常见的功能之一,通常情况下恶意的文件上传,会形成漏洞. 逻辑是这样的:用户通过上传点上传了恶意文件,通过服务器的校验后保存到指 ...

  3. upload-labs通关攻略(1-11关)

    upload-labs通关攻略 upload-labs是练习文件上传很好的一个靶场,建议把upload-labs关卡全部练习一遍 1.下载安装 下载地址 链接:https://pan.baidu.co ...

  4. upload-labs通关攻略(全)

    upload-labs通关攻略 upload-labs是练习文件上传很好的一个靶场,建议把upload-labs关卡全部练习一遍 1.下载安装 下载地址 链接:https://pan.baidu.co ...

  5. DQ8通关攻略

    <勇者斗恶龙8>作为勇者斗恶龙系列首次实现3D的一作,游戏无论是从画面.音效还是游戏系统都表现非常不俗,这款游戏也是PS2主机上必玩的一款大作. 作为PS2平台上唯一一款勇者斗恶龙的正传新 ...

  6. Upload-labs 文件上传靶场通关攻略(下)

    Upload-Labs靶场攻略(下) Pass-11 GET型传参,上传目录可设置,考虑00截断,在/upload/后添加1.php%00,即可上传 Pass-12 POST型传参,上传目录可设置,P ...

  7. Untrusted 游戏 通关攻略

    这个游戏还不错,用了两个晚上的时间通过并写下解法.这个游戏通过修改JS代码来通关的游戏.很考验玩家的解决问题能力,同时也有一定的可玩性. 游戏地址 http://alexnisnevich.githu ...

  8. Omi教程-通讯通讯攻略大全

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...

  9. 打怪升级之路—Security+认证通关攻略(401还是501)

    我花了一个月才把题目过完一遍的(这一个月都上班,下班抽空做几页),这里面走了很多弯路,我把备考过程整理出来希望对大家有帮助. 我是在2019年1月完成的Security+考试,离安全牛课堂直播培训结束 ...

随机推荐

  1. mapreduce中获取输入文件的路径

    InputSplit inputSplit = context.getInputSplit(); String fileName = ((FileSplit) inputSplit).getPath( ...

  2. JetBrains IntelliJ IDEA 15 Ultimate Edition版本激活破解

        由于JetBrains系列新版本注册激活发生了变化,所以原来的激活方式已经不能在使用. 只能用新的方式来破解了.此方式支持所有系列的新版版.包括IDEA15,PHPSTORM10,WEBSTO ...

  3. Python面试题之Super函数

    这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简单说, super函数是调用下一个父类(超类)并返回该父类实例的方法. 这里的下一 ...

  4. 在Windows Server 2008 R2上打开ping的方法

    默认安装完Windows Server 2008 R2后,从外面ping服务器的地址是ping不通的,原因是服务器防火墙默认关闭了ICMP的回显请求.需要按照如下方法打开: 在服务器管理器中选择“配置 ...

  5. Oracle 集合操作

    在 Oracle 中提供了三种类型集合操作:并(UNION).交(INTERSECT).差(MINUS) · UNION:将多个查询的结果组合到一个查询结果之中,没有重复内容 · UNION ALL: ...

  6. 聊聊这两天在linux安装PHP7遇到的坑,真的是坑死人不偿命啊

    前情摘要: 这两天要在虚拟机上部署项目,用于测试在linux上项目效果怎样,然后这两天就一直在部署apache+mysql+php 其实部署还是很简单的具体的apache和mysql部署方法请看其他两 ...

  7. 防盗链&CSRF&API接口幂等性设计

    防盗链技术 CSRF(模拟请求) 分析防止伪造Token请求攻击 互联网API接口幂等性设计 忘记密码漏洞分析 1.Http请求防盗链 什么是防盗链 比如A网站有一张图片,被B网站直接通过img标签属 ...

  8. Effective C++ 条款04:确定对象被使用前已经先被初始化

    规则一 永远在使用对象之前将它初始化 int x = 0; const char* text = "A C-style string"; double d; std:: cin & ...

  9. OSTU二值化算法

    介绍 Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为: 1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个 ...

  10. 判断iframe页面是否是顶层页面

    if (self!=top) {  window.parent.location.reload();}