小编use*_*829的帖子

如何在after_request函数中更改flask中的响应?

我是Flask和python的新手.我有一堆视图以jsonify()格式返回字典.对于这些视图中的每一个,我想添加一个after_request处理程序来改变响应,这样我就可以为该字典添加一个键.我有:

@app.route('/view1/')
def view1():
  ..
  return jsonify({'message':'You got served!'})

@app.after_request
def after(response):
  d = json.loads(response.response)
  d['altered'] = 'this has been altered...GOOD!'
  response.response = jsonify(d)
  return response
Run Code Online (Sandbox Code Playgroud)

我得到的错误是"TypeError:list indices必须是整数,而不是str".如何在请求完成后更改响应字典并添加密钥?

python flask

9
推荐指数
1
解决办法
1万
查看次数

如何将参数传递给 after_request?

我是 Flask 的新手,正在学习@app.after_request@app.teardown_appcontext。我有一个带参数的 oauthlib装饰视图data(这是一个对象)。

@app.route('/api/me')
@oauth.require_oauth()
def me(data):
    user = data.user
    return jsonify(username=user.username)
Run Code Online (Sandbox Code Playgroud)

执行此视图(以及许多其他视图)后,我想更新我的数据库,但需要访问变量data。我如何使用@app.after_request或 来做到这一点@app.teardown_appcontext

@app.after_request
def record_ip(response):
   client = data.client # needs access to "data"
   .... log stuff in my database ...
   return response
Run Code Online (Sandbox Code Playgroud)

python flask

5
推荐指数
1
解决办法
2640
查看次数

如何缓存/记忆我的 SQLAlchemy 函数?

我正在使用 FLask-OAuthlib,并想使用 Flask-Cache 进行一些缓存/记忆。我在视图上进行了缓存设置,但在缓存此函数时遇到了问题:

@oauth.clientgetter
@cache.memoize(timeout=86400)
def load_client(client_id):
  return DBSession.query(Client).filter_by(client_id=client_id).first()
Run Code Online (Sandbox Code Playgroud)

该函数第一次运行(尚未缓存)时它运行良好,但是当它从缓存中获取它时,某些东西会以某种方式搞乱并说它是一个无效的客户端。我不知道它是否错误地缓存了它,或者 @oauth.clientgetter 装饰器是否以某种方式搞砸了缓存。没有缓存一切都工作正常并且客户端是有效的。我尝试像这样移动函数,但得到相同的结果:

class Client(Base):
  __tablename__ = 'client'
  __table_args__ = {'autoload': True}
  user = relationship('User')

  @classmethod
  @cache.memoize(timeout=86400)
  def get_client(cls,client_id):
    return DBSession.query(cls).filter_by(client_id=client_id).first()
Run Code Online (Sandbox Code Playgroud)

那么,在我看来,我有:

@oauth.clientgetter
def load_client(client_id):
  return Client.get_client(client_id)
Run Code Online (Sandbox Code Playgroud)

但这给出了相同的结果。我使用 redis 作为我的缓存后端,我拥有的键/值是:

1) "flask_cache_Pwd2uVDVikMYMDNB+gVWlW"
2) "flask_cache_api.models.Client.get_client_memver"
3) "flask_cache_http://lvho.st:5000/me"
Run Code Online (Sandbox Code Playgroud)

获取flask_cache_Pwd2uVDVikMYMDNB+gVWlW:

"!ccopy_reg\n_reconstructor\np1\n(capi.models\nClient\np2\nc__builtin__\nobject\np3\nNtRp4\n(dp5\nS'_sa_instance_state'\np6\ng1\n(csqlalchemy.orm.state\nInstanceState\np7\ng3\nNtRp8\n(dp9\nS'manager'\np10\ng1\n(csqlalchemy.orm.instrumentation\n_SerializeManager\np11\ng3\nNtRp12\n(dp13\nS'class_'\np14\ng2\nsbsS'class_'\np15\ng2\nsS'modified'\np16\nI00\nsS'committed_state'\np17\n(dp18\nsS'instance'\np19\ng4\nsS'callables'\np20\n(dp21\nsS'key'\np22\n(g2\n(S'Iu6copdawXIQIskY5kwPgxFgU7JoE9lTSqmlqw29'\np23\nttp24\nsS'expired'\np25\nI00\nsbsVuser_id\np26\nL4L\nsVname\np27\nS'Default'\np28\nsV_default_scopes\np29\nS'email'\np30\nsVclient_id\np31\ng23\nsV_redirect_uris\np32\nS'http://localhost:8000/authorized/'\np33\nsVactive\np34\nI1\nsVclient_secret\np35\nS'Vnw0YJjgNzR06KiwXWmYz7aSPu1ht7JnY1eRil4s5vXLM9N2ph'\np36\nsVdescription\np37\nNsb."
Run Code Online (Sandbox Code Playgroud)

获取flask_cache_api.models.Client.get_client_memver:

"!S'+gVWlW'\np1\n."
Run Code Online (Sandbox Code Playgroud)

python caching memoization flask flask-cache

5
推荐指数
1
解决办法
1846
查看次数

如何在Flask中安全地获取具有代理的用户IP地址?

我正在使用Flask,需要获取用户的IP地址.这通常通过request.remote_addr完成,但由于此应用程序托管在第三方(并使用cloudflare),它只返回localhost.

Flask建议获得X-Forwarded-Host但是他们立即说这是一个安全风险.有没有一种安全的方法来获得客户端真正的IP?

python flask

3
推荐指数
1
解决办法
3374
查看次数

在开始烧瓶之前如何检查redis是否正在运行(如果不是则启动它)?

我是Flask的新手,想要确保redis服务器正在运行,如果不是,则启动它.这就是我所拥有的:

@app.before_first_request
def initialize():
  cmd = 'src/redis-cli ping'
  p = subprocess.Popen(cmd,stdout=subprocess.PIPE)
  out, err = p.communicate()
  #if out.startswith('Could not connect to Redis'): #start redis here
  if err is not None: raise Exception(err)
Run Code Online (Sandbox Code Playgroud)

但是,我得到一个错误"OSError:[Errno 2]没有这样的文件或目录"

有没有更简单的方法来检查redis服务器是否正在运行?

python redis flask

3
推荐指数
1
解决办法
3466
查看次数

如何在Flask中为动态生成的jinja2模板注册过滤器?

我是Flask的新手。我试图动态生成模板,以便可以通过AJAX发出请求并将行附加到表中:

@app.template_filter('my_multiplier')
def my_multiplier(n):
  return n*10

@app.route('/')
def index():
  content = [1,2,3,4,5]
  tmplate = get_template()
  html = tmplate.render(content=content)
  return render_template('index.jinja2',html=html)


def get_template():
  html = Template(u'''\
    {% for n in conent %}
    <tr><td>{{ n | my_multiplier }}</td></tr>   
    {% endfor %}''')
  return html
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:TemplateAssertionError:没有名为“ my_multiplier”的过滤器

我究竟做错了什么?(如果我排除过滤器,则模板可以很好地呈现)

python jinja2 flask

2
推荐指数
2
解决办法
5183
查看次数

如何将具有范围、单个单元格和/或直接输入的 ParamArray 转换为数组?

我正在尝试构建一个 UDF,它将接受 ParamArray,该 ParamArray 将接受一个单元格、一系列单元格和/或直接值。然后我需要循环遍历 ParamArray 以获取传递的所有值,但是当我尝试 ReDim 数组时,它会卡住并且循环结束。我这样做是完全错误的吗?因为这看起来工作量太大了。

Function myudf(first As Variant, ParamArray args() As Variant)
    Dim i, j As Long
    Dim argsarray() As Variant
    ReDim argsarray(0, 0)

    For i = 0 To UBound(args)
        If Not IsObject(args(i)) Then
            ReDim Preserve argsarray(0 To UBound(argsarray) + 1)
            argsarray(i) = args(i) ' Handle explicitly passed arguments, e.g. "1,goonie,etc")

        ElseIf IsArray(args(i).Value2) Then
            For j = 1 To UBound(args(i).Value2)
                ReDim Preserve argsarray(0 To UBound(argsarray) + 1)
                argsarray(UBound(argsarray) + 1) = args(j).Value2 ' Handle a …
Run Code Online (Sandbox Code Playgroud)

excel vba

2
推荐指数
1
解决办法
2340
查看次数

标签 统计

flask ×6

python ×6

caching ×1

excel ×1

flask-cache ×1

jinja2 ×1

memoization ×1

redis ×1

vba ×1