Python Django |使用猴子补丁在第三方软件包中添加/更改代码
(+/-3个月的Django工作经验) 我正在使用Python Django |使用猴子补丁在第三方软件包中添加/更改代码,python,django,email,monkeypatching,Python,Django,Email,Monkeypatching,(+/-3个月的Django工作经验) 我正在使用django新闻稿软件包创建新闻稿,并将其发送给我网站上的订户。它使用一个message.html模板,提交模型中添加了该模板的上下文: class Submission(models.Model): # Some irrelevant code, only showing the send_message method below: def send_message(self, subscription):
django新闻稿
软件包创建新闻稿,并将其发送给我网站上的订户。它使用一个message.html
模板,提交模型中添加了该模板的上下文:
class Submission(models.Model):
# Some irrelevant code, only showing the send_message method below:
def send_message(self, subscription):
variable_dict = {
'subscription': subscription,
'site': Site.objects.get_current(),
'submission': self,
'message': self.message,
'newsletter': self.newsletter,
'date': self.publish_date,
'STATIC_URL': settings.STATIC_URL,
'MEDIA_URL': settings.MEDIA_URL
}
unescaped_context = get_context(variable_dict, autoescape=False)
subject = self.message.subject_template.render(
unescaped_context).strip()
text = self.message.text_template.render(unescaped_context)
message = EmailMultiAlternatives(
subject, text,
from_email=self.newsletter.get_sender(),
to=[subscription.get_recipient()],
headers=self.extra_headers,
)
if self.message.html_template:
escaped_context = get_context(variable_dict)
message.attach_alternative(
self.message.html_template.render(escaped_context),
"text/html"
)
# some more code irrelevant to the question
message.send()
基本上,在提交时事通讯时,上下文将添加到Submission.send_message方法的变量_dict中
为了添加更多个性化的可能性,我想添加我自己的上下文变量。据我所知,最好使用monkey补丁来实现这一点,但我无法从方法本身外部访问变量_dict。下面是我的猴子补丁代码:
## Monkey Patching ##
# monkey_patches.py
DJANGO_NEWSLETTER_CONTEXT_PATCH = True # adds context to Submission
def monkey_patch():
if DJANGO_NEWSLETTER_CONTEXT_PATCH:
from newsletter.models import Submission
old_send_message = Submission.send_message
def new_send_message(self, *k, **kw):
old_send_message(self, *k, **kw)
# trying to append to variable dict here, but failing:
print(variable_dict) # gives error
# self.send_message.variable_dict['test'] = 'testvalue' # gives error
# variable_dict['test'] = 'testvalue' # gives error
Submission.send_message = new_send_message
# apps.py
from django.apps import AppConfig
class SomeAppConfig(AppConfig):
name = 'SomeApp'
def ready(self):
try:
from SomeApp.monkey_patches import monkey_patch
monkey_patch()
except ImportError:
pass
非常感谢你的帮助。欢迎任何指点