我是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".如何在请求完成后更改响应字典并添加密钥?
我是 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) 我正在使用 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) 我正在使用Flask,需要获取用户的IP地址.这通常通过request.remote_addr完成,但由于此应用程序托管在第三方(并使用cloudflare),它只返回localhost.
Flask建议获得X-Forwarded-Host但是他们立即说这是一个安全风险.有没有一种安全的方法来获得客户端真正的IP?
我是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服务器是否正在运行?
我是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”的过滤器
我究竟做错了什么?(如果我排除过滤器,则模板可以很好地呈现)
我正在尝试构建一个 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) flask ×6
python ×6
caching ×1
excel ×1
flask-cache ×1
jinja2 ×1
memoization ×1
redis ×1
vba ×1