小编rob*_*les的帖子

在调用@PreUpdate方法之前清除JPA @Transient字段

我有一个User Entity类,我正在尝试进行密码散列.我认为最简单的方法是创建一个用@Transient注释的密码字段和一个哈希密码字段,该密码字段是在使用@PrePersist和@PreUpdate注释的方法持久保存对象之前设置的.

所以我有这样的事情:

@Transient
private String password;

private String hashedPassword;

@PrePersist
@PreUpdate
private void hashPassword() {
    if(password != null) {
        hashedPassword = PasswordHasher.hashPassword(password);
    }
}
Run Code Online (Sandbox Code Playgroud)

当实体持久化时,这非常有效.密码字段仍然由调用hashPassword的时间设置,并且计算并存储hashedPassword的值.

但是,对于更新也是如此 - 即使在合并实体之前设置了密码的新值,该字段在调用hashPassword时也为空.为什么是这样?至少在实体持续存在之前,瞬态字段的值是否应该保持不变?

(我正在使用EclipseLink 2.0.0 btw,如果它有任何区别)

java jpa eclipselink

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

使用python smtplib转发电子邮件

我正在尝试整理一个脚本,该脚本会自动将符合特定条件的某些电子邮件转发给另一封电子邮件.

我使用imaplib和电子邮件工作下载和解析消息,但我无法弄清楚如何将整个电子邮件转发到另一个地址.我是否需要从头开始构建新消息,还是可以以某种方式修改旧消息并重新发送?

这是我到目前为止(client是一个imaplib.IMAP4连接,id是一个消息ID):

import smtplib, imaplib

smtp = smtplib.SMTP(host, smtp_port)
smtp.login(user, passw)

client = imaplib.IMAP4(host)
client.login(user, passw)
client.select('INBOX')

status, data = client.fetch(id, '(RFC822)')
email_body = data[0][1]
mail = email.message_from_string(email_body)

# ...Process message...

# This doesn't work
forward = email.message.Message()
forward.set_payload(mail.get_payload())
forward['From'] = 'source.email.address@domain.com'
forward['To'] = 'my.email.address@gmail.com'

smtp.sendmail(user, ['my.email.address@gmail.com'], forward.as_string())
Run Code Online (Sandbox Code Playgroud)

我确定我需要对消息的MIME内容稍微复杂一些.当然,有一些简单的方法可以转发整个邮件吗?

# This doesn't work either, it just freezes...?
mail['From'] = 'source.email.address@domain.com'
mail['To'] = 'my.email.address@gmail.com'
smtp.sendmail(user, ['my.email.address@gmail.com'], mail.as_string())
Run Code Online (Sandbox Code Playgroud)

python email imap smtp smtplib

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

zsh:展开当前命令行中的上一个参数

我发现自己经常想做一些简单的命令,比如:

cp /really/long/path/from/file.txt /really/long/path/to/file.txt

虽然我已经使用了类似的快捷方式!!,并!$经常,这将是很好能够引用的最后一个参数在目前的命令行(和可选的扩展它进行编辑).有没有办法在zsh中执行此操作,或者其他一些等效的技巧来节省时间?

shell zsh keyboard-shortcuts

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

SQLAlchemy引发None,导致TypeError

我正在使用SQLAlchemy中的声明性扩展,当我尝试使用不正确的数据保存映射类的实例时,我注意到一个奇怪的错误(特别是声明为nullable = False且值为None的列).

班级(简化):

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, autoincrement=True)
    userid = Column(String(50), unique=True, nullable=False)
Run Code Online (Sandbox Code Playgroud)

导致错误(会话是SQLAlchemy会话):

>>> u = User()
>>> session.add(u)
>>> session.commit()

...

TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType
Run Code Online (Sandbox Code Playgroud)

查看导致此异常的代码,我发现(在sqlalchemy.orm.session中):

except:
    transaction.rollback(_capture_exception=True)
    raise
Run Code Online (Sandbox Code Playgroud)

在这种情况下捕获的异常是sqlalchemy.exc.OperationalError.如果我将这些行更改为:

except Exception as e:
    transaction.rollback(_capture_exception=True)
    raise e
Run Code Online (Sandbox Code Playgroud)

然后问题就消失了,而且抛出OperationalError而不是None.原始代码不应该在任何最新版本的Python中工作吗?(我正在使用2.7.2)这个错误是否以某种方式特定于我的应用程序?

Python 2.7.2

SQLAlchemy 0.7.5

更新:错误似乎以某种方式特定于我的应用程序.我正在使用SQLAlchemy引擎包装一个eventlet.db_pool,这似乎是问题的根源.使用内存中的SQLite或基本的MySQL引擎运行我的简单测试没有这个问题,但是使用db_pool就可以了.

测试用例:https://gist.github.com/1980584

完整的追溯是:

Traceback (most recent call last):
  File "test_case_9525220.py", line 41, in <module>
    session.commit()
  File "/usr/local/Cellar/python/2.7.2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 645, …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

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

将Flask的SERVER_NAME绕过一条路线

我正在使用Flask应用程序,在不同的子域下有许多路由.它使用SERVER_NAME设置并在不同蓝图上设置子域,以根据子域进行初始路由.

我正在尝试配置一个绕过主机SERVER_NAME现在要求的路由,并且无法弄明白.在保持SERVER_NAME设定的同时可以做到这一点吗?

即使SERVER_NAME="mydomain.com"请求是我想要一个特定的路由可访问http://localhost:80/my/special/route/

python flask

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

标签 统计

python ×3

eclipselink ×1

email ×1

flask ×1

imap ×1

java ×1

jpa ×1

keyboard-shortcuts ×1

shell ×1

smtp ×1

smtplib ×1

sqlalchemy ×1

zsh ×1