我目前正在开发一个Flask应用程序(已经过去一年),我遇到了一个相当......奇怪的错误.我有一些文件总是包含在我的Jinja2模板(navbars)中,它们使用用户的名字和头像.因此,每次我渲染模板时,我都会将其传递给用户.我最近注意到我的prod服务器上有错误:
<img alt="image" class="img-circle" src="{{ user.image }}" style="width: 48px;"/>
File "/usr/local/lib/python2.7/dist-packages/jinja2/environment.py", line 397, in getattr
return getattr(obj, attribute)
jinja2.exceptions.UndefinedError: 'user' is undefined
Run Code Online (Sandbox Code Playgroud)
这是我的一个导航栏.呈现此模板的方法使用此方法:
@mod.route('/broken_pus', methods=['POST', 'GET'])
def view_broken_pus():
return render_template("view_broken_pus.html", user=g.user, urls_for_active_clients=DeletedURLs.objects()[0].urls_for_active_clients, other_urls=DeletedURLs.objects()[0].other_urls)
Run Code Online (Sandbox Code Playgroud)
如您所见,我传递了user = g.user.我在我的网站的每个视图上都这样做.它适用于所有地方,除了这个方法,这是非常小的.我有很多其他类似的路线,只有一个渲染模板,所以我没有得到什么问题.
我也得到了另一种方法,更大,以前总是有效:
@mod.route('/users/add', methods=['GET', 'POST'])
@requires_roles("admin", "project-leader")
def add():
"""
Method adding a new user.
"""
# We do not use WTForms there since we need custom checkboxes for the role
# Instead we use basic HTML and treat the checkboxes here
if request.method == …Run Code Online (Sandbox Code Playgroud) 这是我的情况.我有最新的当前数据库(让我们称之为current_db),但由于最近崩溃,其数据不完整.一些数据已被删除,这个删除从2年前到昨天.
我从2013年11月开始备份这个数据库(我们称之为backup_db),其数据已经完成,直到2013年11月.由于current_db保存了2013年11月至2014年2月期间的一些数据,我不想只是废弃它,并从备份工作.所以我想将current_db导入backup_db,忽略重复的数据.
我已经找到了方法来做到这一点,但找不到任何相关的方法.我遇到过一些SELECT查询,但它们都是简单的查询.我的数据库有20个表,我真的没有看到自己构建了一个巨大的查询来导入所有这些.还有其他方法吗?
谢谢
我目前陷入了一个相当"大"的问题,我会尽可能地清楚简明.我正在使用Flask开发Python工具.它意味着是一个内联网.我的想法是我有一个客户页面.有它的名字,许多其他信息,以及一个庞大的清单.
信息已经写入输入字段,因此用户只需在那里编辑它们,按回车键,页面将重新加载编辑的信息(通知,使用闪烁的消息和咆哮).大量的清单迫使我转移到使用AJAX的系统,因为我希望它在用户勾选框并在输入中输入内容时"实时"更新,而无需重新加载页面.
因此,我也将我对信息的基本输入切换为AJAX,以便重新加载法师.
我遇到过两个问题:
第一个涉及Flask的消息闪烁功能.我有一个方法更新数据库中的客户端名称,闪烁消息(成功或失败,取决于许多事情),然后再次显示页面.为了避免页面重新加载,我正在使用AJAX管理表单提交.
问题是,我的python方法会闪烁消息.一旦我回到我的html页面(由于它是AJAX),它还没有重新加载,因此Jinja2的get_flashed_message函数没有返回任何内容,因为它尚未更新.因此,我无法检索那些闪烁的消息.
我怎么能得到这些?我看到的唯一解决方案是摆脱任何flash的使用,并编写我自己的消息système,我将从方法返回,然后在javascript中处理.这看起来非常愚蠢,因为Flash是Flask的一个功能,它被AJAX"无用"了?我觉得我错过了什么.(作为一个注释,到目前为止,我的闪存消息管理是在我的基本布局中进行的,它调用一个贯穿所有消息的模板并将其显示为咆哮通知)
第二个问题涉及url_for.这是我的表单,用于编辑客户端的名称:
<form id="changeClientName" method="POST" action="{{ url_for('clients.edit_client_name', name=client.name) }}" style="display:inline !important;">
<input type="text" name="name" class="form-control" value="{{ client.name }}" >
<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/>
</form>
Run Code Online (Sandbox Code Playgroud)
如您所见,action属性使用url_for调用正确的方法来编辑客户端.我的方法看起来像这样:
@mod.route('/edit/<name>/', methods=['POST'])
def edit_client_name(name):
Run Code Online (Sandbox Code Playgroud)
所以url路径是/ edit/the_client_name.因此,在编辑之后,如果我们要重新编辑此名称,则新URL为/ edit/the_new_client_name.显然,一旦调用了该方法,我的AJAX必须更改此操作属性,将其替换为新URL(如果用户想要重新编辑名称而不更改页面/重新加载页面).这是我的第二个问题.
新名称存储在javascript中.行动仍然是旧的网址.所以我必须使用新名称调用url_for.我发现绝对没有办法将Javascript变量传递给Jinja2.
我要这个 :
url_for('clients.edit_client_name', name=client.name)
Run Code Online (Sandbox Code Playgroud)
成为这样:
url_for('clients.edit_client_name', name=my_javascript_variable_one_way_or_another)
Run Code Online (Sandbox Code Playgroud)
我只好打电话修饰形式的属性的js函数,并修改我的行为属性与这个新的url_for.But我发现没有办法让这个简单的事情,即给一个JavaScript变量的Jinja2,这似乎我不太可能.
所以这是我的两个问题.如何使Flash与AJAX兼容?我怎样才能将javascript属性传递给Jinja2?
我真诚地希望找到这两个"愚蠢"问题的解决方案.我能看到的唯一解决办法是编码我自己的邮件系统,这会破坏闪光的目标,使其失去与AJAX,这似乎是愚蠢的,在我的模板,这完全违背了瓶制作的最初兴趣硬编码的网址来自方法的URL独立,并且URL更改非常灵活.
谢谢.
我目前正在用 Python 进行一个游戏项目,但我发现自己在 Python 背后的“概念”方面苦苦挣扎,因为我已经习惯了 C 或 Java 等语言。
我曾经试图“鸿沟”我在几个文件中的项目(即称为模块,如果我没有记错,虽然他们都在为我将与C源文件做同样的文件夹中)与不同的主题:objects.py,map.py,rendering.py等。它们包含与这些概念相关的不同类和函数。我有一个main.py包含我所有的“主要”函数(例如new_game等等)以及第一个“调用”,它将调用main_menu.
我还有一个constants.py文件,用于存储常量值。现在问题是,我的游戏中有几个“全局”变量和对象:玩家对象、地图等等。我希望在所有模块中保持这些变量的全局性,并且能够从任何地方访问和修改它们。
我首先创建一个global_variables.py在我列出的所有我的变量文件(如map = None,player = None等),期待通过其他模块进行修改。
问题是,每次我global_variables再次调用 import时,它都会遍历整个代码并将它们全部重新初始化为None,这显然是我不想要的。
我在另一个 stackoverflow 线程上读到一个提示:init()在我的文件中创建一个函数,我将在其中初始化所有变量并将它们声明为全局变量。这样,我调用global_variables.init()一次,然后我可以简单global_variables.player地访问播放器并对其进行修改。
它运行良好,但我觉得它很杂乱。我有很多global foo, 其次是foo = None感觉像是不必要的代码行。此外,当我输入 global_variables 时,IDE 无法“访问”变量。,它不建议将变量作为自动完成,这很痛苦。
那么还有另一种方法吗?这个想法是从任何函数中“声明”变量,以便 IDE 理解它们在那里,但只“初始化”它们一次,这样我就可以避免每次导入global_variables模块时重置它们。