据我了解Flask中的g变量,它应该为我提供一个存储数据的全局位置,例如在登录后保存当前用户.它是否正确?
我希望我的导航在整个站点登录后显示我的用户名.
我的观点包含
from Flask import g #among other things
Run Code Online (Sandbox Code Playgroud)
在登录期间,我分配
user = User.query.filter_by(username = form.username.data).first()
if validate(user):
session['logged_in'] = True
g.user = user
Run Code Online (Sandbox Code Playgroud)
我似乎无法访问g.user.相反,当我的base.html模板具有以下内容时......
<ul class="nav">
{% if session['logged_in'] %}
<li class="inactive">logged in as {{ g.user.username }}</li>
{% endif %}
</ul>
Run Code Online (Sandbox Code Playgroud)
我收到错误:
jinja2.exceptions.UndefinedError
UndefinedError: 'flask.ctx._RequestGlobals object' has no attribute 'user'
Run Code Online (Sandbox Code Playgroud)
登录否则工作正常.我错过了什么?
在以前版本的ggplot2中,我能够使用以下两个命令之一来格式化我的x日期:
scale_x_date(breaks = "1 month", minor_breaks = "1 week", labels=(date_format="%B")) +
Run Code Online (Sandbox Code Playgroud)
要么
scale_x_date(major="months", minor="weeks", format="%B") +
Run Code Online (Sandbox Code Playgroud)
生成完整月份名称的"%B"格式.
(我担心我再也无法区分哪一个有效,因为它们都被注释掉了.)
我不记得什么时候,但在ubuntu 12.04升级中更新R或ggplot之后,这对我来说不再适用.现在,完全相同的数据会产生错误:
Error in scale_labels.continuous(scale) :
Breaks and labels are different lengths
Run Code Online (Sandbox Code Playgroud)
与第一,和
Error in continuous_scale(aesthetics, "date", identity, breaks = breaks, :
unused argument(s) (major = "months", minor = "weeks", format = "%B")
Run Code Online (Sandbox Code Playgroud)
随着第二个.
如果我删除labels =参数,并申请
scale_x_date(breaks = "1 month", minor_breaks = "1 week") +
Run Code Online (Sandbox Code Playgroud)
它在每个月的第一天产生日期格式"YYYY-MM-DD".
咨询功能帮助?scale_x_date,我也尝试了以下方法:
scale_x_date(breaks = "1 month", minor_breaks = "1 week", labels=date_format("%B")) +
Run Code Online (Sandbox Code Playgroud)
但是这会产生这个错误:
Error in structure(list(call = …Run Code Online (Sandbox Code Playgroud) 我正在与许多深度嵌套的json进行交互,我没有写,并且想让我的python脚本对无效输入更"宽容".我发现自己编写了涉及try-except块的内容,而宁愿将这个可疑的函数包装起来.
我理解吞下异常是一个糟糕的政策,但我宁愿他们稍后打印和分析,而不是实际停止执行.在我的用例中继续执行循环而不是获取所有密钥更有价值.
这就是我现在正在做的事情:
try:
item['a'] = myobject.get('key').METHOD_THAT_DOESNT_EXIST()
except:
item['a'] = ''
try:
item['b'] = OBJECT_THAT_DOESNT_EXIST.get('key2')
except:
item['b'] = ''
try:
item['c'] = func1(ARGUMENT_THAT_DOESNT_EXIST)
except:
item['c'] = ''
...
try:
item['z'] = FUNCTION_THAT_DOESNT_EXIST(myobject.method())
except:
item['z'] = ''
Run Code Online (Sandbox Code Playgroud)
这是我想要的,(1):
item['a'] = f(myobject.get('key').get('subkey'))
item['b'] = f(myobject.get('key2'))
item['c'] = f(func1(myobject)
...
Run Code Online (Sandbox Code Playgroud)
或(2):
@f
def get_stuff():
item={}
item['a'] = myobject.get('key').get('subkey')
item['b'] = myobject.get('key2')
item['c'] = func1(myobject)
...
return(item)
Run Code Online (Sandbox Code Playgroud)
...我可以将单个数据项(1)或主函数(2)包装在某个函数中,该函数将执行暂停异常转换为空字段,打印到stdout.前者将是一种逐项跳过 - 其中该键不可用,它记录为空白并继续前进 - 后者是行跳过,如果任何字段不起作用,则整个记录为跳过.
我的理解是某种包装应该能够解决这个问题.这是我尝试过的包装器:
def f(func):
def silenceit():
try:
func(*args,**kwargs)
except:
print('Error')
return(silenceit)
Run Code Online (Sandbox Code Playgroud)
这就是为什么它不起作用.调用一个不存在的函数,它不会尝试捕获它:
>>> …Run Code Online (Sandbox Code Playgroud) 在emacs 24中检查和发送电子邮件的当前权威方式是什么?
我检查了以下SO链接:
并了解包含smtpmail,rmail,以及.authinfo文件的软件包.
我创建了一个表单的.authinfo文件:
machine mail.example.org port 25 login myuser password mypassword
并将以下内容添加到我的init.el文件中:
(setq smtpmail-stream-type 'ssl)
(setq smtpmail-smtp-server "smtp.gmail.com")
(setq smtpmail-smtp-service 465)
Run Code Online (Sandbox Code Playgroud)
(作为第二个链接,超级用户,说.)
但是当我运行时M-x rmail,它仍然连接到我的计算机的本地电子邮件地址,而不是我的Gmail.设置登录和读/写电子邮件需要什么?(如果你可以包括击键,那也会非常有帮助.)
我正在运行ubuntu 12.04,如果这有任何区别的话.
我想在我在R中制作的3面小平面网格图中添加一个脚注引用.这是一个信用数据源的脚注.理想情况下,我希望它位于所有三个轴的下方和外部 - 最好是在左下方.
我使用的ggplot2也是ggsave().这意味着我不能使用grid.text()基于x11()-based 的解决方案,因为它只能在窗口上绘制,而不能添加到ggplot对象中.
使用相反png() ...code... dev.off()似乎不是一个选项,因为我需要ggsave调整参数大小,并找到这个命令产生更好,更清晰的打印(这也更快,因为我不打印到屏幕).
这是我的基本代码:
p1 <- ggplot(data, aes(date, value))
facet_grid(variable ~ .) + geom_point(aes(y =value), size=1) +
theme_bw() +
opts(title=mytitle)
print(p1)
ggsave("FILE.png",width=mywidth, height=myheight, p1, dpi=90)
Run Code Online (Sandbox Code Playgroud)
我试过了:
p1 <- ggplot(data, aes(date, value))
facet_grid(variable ~ .) + geom_point(aes(y =value), size=1) +
theme_bw() +
opts(title=mytitle)
print(p1)
grid.text(unit(0.1,"npc"),0.025,label = "Data courtesy of Me")
grid.gedit("GRID.text", gp=gpar(fontsize=7))
ggsave("FILE.png",width=mywidth, height=myheight, p1, dpi=90)
Run Code Online (Sandbox Code Playgroud)
这适当地将脚注放在x11()显示的左下角,在图的外部,但不幸的是,因为它没有应用于p1对象,所以它不会被ggsave命令保存.
我也尝试过:
p1 <- ggplot(data, aes(date, value))
facet_grid(variable …Run Code Online (Sandbox Code Playgroud) 我不打算打开危险的调试控制台,但是我的应用程序出现了500错误,并且似乎没有为我编写任何输出以进行更深入的调查.
我在邮件列表上看到了这个交换,这使我进入了关于日志记录错误的页面.
但是,我仍然觉得这很令人困惑,并且有几个问题:
(1)下面的内容应该在哪个文件中?
ADMINS = ['yourname@example.com']
if not app.debug:
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler('127.0.0.1',
'server-error@example.com',
ADMINS, 'YourApplication Failed')
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
Run Code Online (Sandbox Code Playgroud)
...假设大型应用程序的"越来越大"的文件模式? __init__.py? config.py? run.py?
(2)我被那里的选择所震撼,无法分辨我应该使用哪些.我应该打开哪些记录器,使用什么设置来复制本地python服务器调试,当我运行run.py时,我得到stdout?我发现默认的本地输出流非常有用,比页面中的交互式调试器更有用.有没有人有一个模式,他们可以分享设置复制这个与nginx部署,输出到日志?
(3)有什么我需要改变的,不是在烧瓶级别,而是在nginx中,比如在我的/etc/nginx/sites-available/appname文件中,以启用日志记录?
具体来说,我正在寻找信息,就像我在本地运行python时获得的信息,例如,为什么包没有工作,或者我的语法错误可能是什么,或者什么变量不存在:
$ python run.py
Traceback (most recent call last):
File "run.py", line 1, in <module>
from myappname import app
File "/home/me/myappname/myappname/__init__.py", line 27, in <module>
file_handler.setLevel(logging.debug)
File "/usr/lib/python2.7/logging/__init__.py", line 710, in setLevel
self.level = _checkLevel(level) …Run Code Online (Sandbox Code Playgroud) 我在烧瓶登录中使用了一个烧瓶片段来检查用户是否已登录:
from functools import wraps
def logged_in(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if session.get('logged_in') is not None:
return f(*args, **kwargs)
else:
flash('Please log in first.', 'error')
return redirect(url_for('login'))
return decorated_function
Run Code Online (Sandbox Code Playgroud)
我这样装饰视图:
@app.route('/secrets', methods=['GET', 'POST'])
@logged_in
def secrets():
error = None
Run Code Online (Sandbox Code Playgroud)
我也想为授权做类似的事情.现在,我有很多视图来检查用户是否拥有资源,让我们说hotdogs资源.
如果logged_in用户是该特定热狗的所有者,他可以编辑和管理他的热狗.如果他不是,我会把他踢到未经授权的屏幕.
@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
def addmustard(hotdog):
if not (authorizeowner(hotdog)):
return redirect(url_for('unauthorized'))
do_stuff()
Run Code Online (Sandbox Code Playgroud)
authorizeowner() 将热狗作为输入并检查记录的热狗所有者是否与会话变量中列出的所有者名称匹配.
我尝试制作一个类似于我登录的owns_hotdog包装器/装饰器功能,但它抱怨它不接受参数.我怎样才能达到类似的效果?就像是...
def owns_hotdog(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not authorizeowner(hotdog):
return f(*args, **kwargs)
else:
flash('Please log in first.', 'error')
return redirect(url_for('login'))
return decorated_function
Run Code Online (Sandbox Code Playgroud)
从错误消息中,装饰器似乎没有收到Flask视图可以从路径中的变量访问的热狗参数.我的希望是......
@app.route('/<hotdog>/addmustard/',methods=["GET"]) …Run Code Online (Sandbox Code Playgroud) 我正在使用dict.get('keyword')方法查询嵌套字典.目前我的语法是......
M = cursor_object_results_of_db_query
for m in M:
X = m.get("gparents").get("parent").get("child")
for x in X:
y = x.get("key")
Run Code Online (Sandbox Code Playgroud)
但是,有时其中一个"父"或"子"标签不存在,我的脚本失败.我知道使用get()我可以在表格中不存在密钥的情况下包含默认值...
get("parent", '') or
get("parent", 'orphan')
Run Code Online (Sandbox Code Playgroud)
但是,如果我包含任何Null,''或者我可以想到的空,则链接.get("child")在调用时失败,''.get("child")因为""没有方法.get().
现在我解决这个的方法是使用一束连续的try-except围绕每个.get("")电话,但似乎愚蠢和unpython ---有没有办法为默认的回报"skip"或"pass"什么的,将仍然支持链接和失败智能,而不是深 - 潜入不存在的钥匙?
理想情况下,我希望这是对表单的列表理解:
[m.get("gparents").get("parent").get("child") for m in M]
Run Code Online (Sandbox Code Playgroud)
但是当缺席的父母导致.get("child")呼叫终止我的程序时,这当前是不可能的.
我是python包管理的新手,肯定做错了.我被鼓励创建一个目录结构,如下所示:
bagoftricks
??? bagoftricks
? ??? bagoftricks
? ? ??? __init__.py
? ? ??? bagoftricks.py
? ??? __init__.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)
bagoftricks.py包含两个函数,levenshtein()和geofind().
我想称之为:
import bagoftricks
x = bagoftricks.levenshtein(arg1,arg2)
Run Code Online (Sandbox Code Playgroud)
相反,我发现我必须这样做:
import bagoftricks
x = bagoftricks.bagoftricks.levenshtein(arg1,arg2)
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来组织我的包,而没有命名冗余?
UPDATE
所以,我按照下面的Avichal Badaya的说明,删除了一级嵌套.也就是说,我现在......
bagoftricks
??? bagoftricks
? ??? __init__.py
? ??? bagoftricks.py
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)
但是,打电话给这个包,我还是......
from bagoftricks.bagoftricks import geofind()
Run Code Online (Sandbox Code Playgroud)
要么
import bagoftricks
Run Code Online (Sandbox Code Playgroud)
然后
>>> bagoftricks.bagoftricks.geofind()
Run Code Online (Sandbox Code Playgroud)
而不是期望....
from bagoftricks import geofind()
Run Code Online (Sandbox Code Playgroud)
要么
import bagoftricks
>>> bagoftricks.geofind()
Run Code Online (Sandbox Code Playgroud)
我无法删除额外的嵌套层.当我通过类比尝试删除一个级别的嵌套时,我的模块是平的,如:
bagoftricks
??? …Run Code Online (Sandbox Code Playgroud) 我知道有类似的问题,例如:
但我问这个问题是因为我正在寻找一个更具特色的区别,请用几个用例来支持.
所以,我是一个python用户想要制作以下两者之一的程序:
在一台机器上完成,并在多台机器上处理它们.我熟悉python中的(单机)多处理软件包,我现在正在编写mapreduce样式代码.我知道我的功能很容易并行化.
在询问我常见的智能CS建议提供者时,我的问题是:
"我想接受一项任务,将其分成一堆在一堆机器上同时执行的子任务,然后将这些结果聚合并根据其他一些功能处理,这可能是一个减少,或者可能是指令例如,串行添加到数据库."
根据我的用例的分解,我认为我同样可以使用Hadoop或一组Celery工作者+ RabbitMQ经纪人.然而,当我问圣人的建议提供者时,他们回应我,好像我完全疯狂地将Hadoop和Celery视为可比较的解决方案.我已经阅读了很多关于Hadoop的内容,以及关于Celery的内容---我认为我对两者的作用都有很好的把握 - 我似乎不明白的是:
我知道Hadoop是大数据标准,但Celery也看起来很受支持; 我感谢它不是java(流式API python必须用于hadoop看起来对我不舒服),所以我倾向于使用Celery选项.