小编Ben*_*Ben的帖子

如何将Flask优秀的调试日志消息写入生产中的文件?

我有一个Flask应用程序运行良好并产生偶然的错误,当它运行时可见debug=True:

if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

我收到有用的错误消息,例如:

Traceback (most recent call last):
  File "./main.py", line 871, in index_route

KeyError: 'stateIIIII'
Run Code Online (Sandbox Code Playgroud)

我想在生产中运行应用程序(使用Lighttpd + fastcgi)时,将这些错误消息保存到文件中.

寻找不同的StackOverflow问题后(http://flask.pocoo.org/docs/errorhandling/,http://docs.python.org/2/library/logging.html等); Flask邮件列表; 和一些博客,似乎没有简单的方法只是将所有伟大的错误消息发送到文件 - 我需要使用Python日志记录模块来自定义事物.所以我提出了以下代码.

在我的应用程序文件的顶部,我有各种导入,后跟:

app = Flask(__name__)

if app.debug is not True:   
    import logging
    from logging.handlers import RotatingFileHandler
    file_handler = RotatingFileHandler('python.log', maxBytes=1024 * 1024 * 100, backupCount=20)
    file_handler.setLevel(logging.ERROR)
    app.logger.setLevel(logging.ERROR)
    app.logger.addHandler(file_handler)
Run Code Online (Sandbox Code Playgroud)

然后我将每个路由的代码放在try/except语句中,并使用traceback来确定错误来自哪一行并打印一条漂亮的错误消息:

def some_route():
    try:
        # code for route in here (including a return statement)

    except:
        exc_type, exc_value, exc_traceback = …
Run Code Online (Sandbox Code Playgroud)

python logging flask

57
推荐指数
3
解决办法
6万
查看次数

如何在 Django 中处理来自 HTMX 的 PATCH 请求?

我想向我的应用程序发送 PATCH 请求,但我不确定如何在 Django 中使用该请求。我目前收到以下错误。

AttributeError: 'WSGIRequest' object has no attribute 'PATCH'
Run Code Online (Sandbox Code Playgroud)

HTMX 文件中的输入字段如下所示(我还确保发送 CSRF 令牌):

<input 
        name="myfield"
        hx-patch="{% url 'my_update' myobj.id %}"
        hx-swap="none" />
Run Code Online (Sandbox Code Playgroud)

这是 Django 视图

class MyHtmxView(View):

def patch(self, request, *args, **kwargs):
    form = MyForm(request.PATCH)
    if form.is_valid():
        form.save()
        # return an okay status? 200?
    else:
        return HttpResponse(self.form_invalid(form))
Run Code Online (Sandbox Code Playgroud)

Django 正在接收请求,但不确定如何处理 request.PATCH。我可以在 Django 文档中看到有 HttpRequest.GET 和 HttpRequest.POST 但没有 HttpRequest.PATCH https://docs.djangoproject.com/en/3.2/ref/request-response/#httprequest-objects。处理补丁的最佳方法是什么?

django django-templates django-models django-views htmx

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

关闭浏览器窗口后,为什么某些Flask会话值会从会话中消失,但稍后在没有添加它的情况下重新出现?

所以我对Flask会话的理解是我可以像字典一样使用它并通过执行以下操作为会话添加值:

session ['key name'] =''some value here'

这很好.

在路由中我使用AJAX post进行客户端调用,我为会话分配了一个值.它工作正常.我可以点击我网站的各个页面,价值保留在会话中.但是,如果我关闭浏览器窗口,然后返回我的站点,那里的会话值就消失了.

所以这很奇怪,你会认为问题是会话不是永久性的.我还实施烧瓶OpenID和使用该会话来存储信息,并且坚持,如果我关闭浏览器窗口并打开它再次备份.关闭浏览器窗口后我也检查了cookie,但在回到我的网站之前,cookie确实还在那里.

另一个奇怪的行为(可能是相关的)是我在访问AJAX后期路由并分配正确值时,为了测试目的而写入会话的一些值将消失.所以这很奇怪,但真正奇怪的是当我关闭浏览器窗口并再次打开它,并因此失去了我试图保留的价值时,我之前丢失的那些实际上又回来了!它们没有被重新分配,因为我的Python文件中没有代码可以重新分配这些值.

以下是助手的一些输出使其更清晰.它们都是从真实页面的路线中输出的,而不是我上面提到的AJAX后期路线.

这是我在会话中分配了要存储的值后的输出.值键是'userid' - 所有其他值都是我在尝试解决此问题时添加的虚拟值.'userid':只要我不关闭浏览器窗口,8就会保留在会话中.我可以访问其他路线,价值将保持原样.

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]
Run Code Online (Sandbox Code Playgroud)

如果我关闭浏览器窗口,然后返回到站点,但没有重做AJAX发布请求,我得到这个输出:

['session.=', <SecureCookieSession {'adding using before request': 'hi', '_permanent': True, 'yo': 'yo'}>]
Run Code Online (Sandbox Code Playgroud)

'yo'值不在第一个输出中.我不知道它来自哪里.我搜索了我的代码'yo',并没有我在任何地方分配该值的实例.我想我可能在几天前​​将其添加到会议中.因此它似乎是持久的,但在写入其他值时被隐藏.

最后一个是我再次访问AJAX后期路由,然后转到使用debug打印出密钥的页面.与我上面粘贴的第一个输出相同的输出,你会期望的,'yo'值再次消失(但如果我关闭浏览器窗口它会返回)

['session.=', <SecureCookieSession {'userid': 8, 'test_variable_num': 102, 'adding using before request': 'hi', '_permanent': True, 'test_variable_text': 'hi!'}>]
Run Code Online (Sandbox Code Playgroud)

我在Chrome和Firefox中测试了这个.

所以我觉得这很奇怪,我猜这是因为对会话如何工作的误解.我认为它们是字典,我可以将字典值写入其中并在几天后检索它们,只要我将会话设置为永久性并且cookie不会被删除.

任何想法为什么会发生这种奇怪的行为?

python session session-cookies flask

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

如何在 Cordova 中加载 node_modules?(网络浏览器模块,不是 node.js 特定的)

我创建了一个新的 Cordova 应用程序

cordova create MyApp
Run Code Online (Sandbox Code Playgroud)

我想使用几个 Web 库(不依赖于 node.js),所以我用 npm 安装了它们。例如

npm install onsenui vue-onsenui --save-dev
Run Code Online (Sandbox Code Playgroud)

目录结构如下所示:

config.xml
hooks/
node_modules/
package.json
platforms/
plugins/
res/
www/
Run Code Online (Sandbox Code Playgroud)

www 中的 index.html 文件具有包含库的脚本标签

<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="vue.js"></script>
<script type="text/javascript" src="onsenui.js"></script>
<script type="text/javascript" src="vue-onsenui.js"></script>
Run Code Online (Sandbox Code Playgroud)

运行该cordova run browser命令时,Web 服务器运行良好并按原样显示页面,包括加载 cordova.js 文件,但它为其他库返回 404。

有没有办法在 Cordova 中使用这些节点模块而不将它们复制到 www 目录中?

npm cordova

8
推荐指数
1
解决办法
5043
查看次数

谷歌地图Places API V3自动完成 - 在输入时选择第一个选项(让它保持这种方式)

这个问题与这个问题的答案有关:谷歌地图Places API V3自动完成 - 在输入时选择第一个选项.基本上,当用户按下回车键时,该字段使用自动完成列表中的第一个建议.该问题的答案有一个jsfiddle - http://jsfiddle.net/dodger/pbbhH/ - 除非文本字段失去焦点,否则字段值将返回到部分输入的值.

例如,用户单击输入字段并键入"ox",自动完成框会弹出一些建议,然后用户按Enter键.然后更改地图以显示自动完成框中第一个项目的位置(带有标记),输入字段的值将更改为自动完成框中的第一个项目.然后,用户单击字段外的某处,输入字段的值将返回"ox".

我希望输入字段的值保留为第一个自动完成建议.

javascript google-maps autocomplete google-maps-api-3

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

为什么我的文件上传(到Flask服务器)没有出现在request.files中但出现在request.stream中?

我有一个表单(恰好在iframe中),如下所示:

<form id='picture-file-input-button' action='/post-picture' method='post' enctype='multipart/form-data' encoding='multipart/form-data'>
    <button type='button' class='choose-picture-button'>Choose picture</button>
    <input class='picture-file-input' type='file' />
</form>
Run Code Online (Sandbox Code Playgroud)

我使用$('#picture-file-input-button').submit()提交表单,这样可以正常工作.请求被发送到正确的URL并且我的Flask函数将其拾取并且响应被正确地发送回客户端(iframe被重新加载).

我没有在Flask做任何花哨的事情.它看起来像这样:

@app.route('/post-picture', methods=['POST'])
def post_provider_page_route():
    app.logger.debug(request)
    app.logger.debug(request.data)
    app.logger.debug(request.stream)
    app.logger.debug(request.files)
    app.logger.debug(request.form)
    return render_template('iframe_template.html')
Run Code Online (Sandbox Code Playgroud)

调试所有输出为空的ImmutableMultiDict,但request.stream除外,它输出:

<werkzeug.wsgi.LimitedStream object at 0x9a7d30c>
Run Code Online (Sandbox Code Playgroud)

我希望看到该文件显示在request.files中.为什么它不会出现在request.files中?

javascript forms iframe file-upload flask

4
推荐指数
1
解决办法
4575
查看次数

如何在python中具有特定平均值的范围内生成随机数?

所以我想说我想在-1000到1000之间生成一个随机数,我希望平均值为x.我该怎么做?

编辑:为了清楚起见,生成的数字应该落在标准正态分布中,平均值为x.

因此,如果我生成了一千个数字并找到了它们的平均数,则它将是x.

我试过这个,但它似乎不起作用:

sum_ = 0
for i in range(0, 10):
  sum_ += random.triangular(-1000, 1000, 10)
print sum_ / 10
Run Code Online (Sandbox Code Playgroud)

我希望这能给我一些东西~10但我显然没有使用正确的代码.

python random math

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

表单的 HTMX POST 请求正在运行,但不包含字段数据

我有一个表单应该提交包含表单字段数据的 POST 请求,但是当后端应用程序收到请求时,它是空白的(没有数据)。为什么它不起作用?

<form hx-post="/meme">
    <label for="name">Funny meme name</label>
    <input type="text" id="name">

    <label for="rating">Funniness rating</label>
    <input type="number" id="rating">

    <button type="submit">Submit!</button>
</form>
Run Code Online (Sandbox Code Playgroud)

htmx

0
推荐指数
1
解决办法
3096
查看次数