在学习flask开发,书中一段异步发送邮件的代码是这样写的:
from threading import Thread
from flask import current_app, render_template
from flask.ext.mail import Message
from . import mail
def send_async_email(app, msg):
with app.app_context():
mail.send(msg)
def send_email(to, subject, template, **kwargs):
app = current_app._get_current_object()
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + ' ' + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)
thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
return thr
在send_mail
函数中,程序使用了current_app._get_current_object()
赋值给app
作为当前程序的实例。此处为什么不直接使用current_app
呢?
flask官方文档中是这样解释这个方法_get_current_object()
的:
Return the current object. This is useful if you want the real object behind the proxy at a time for performance reasons or because you want to pass the object into a different context.
看了这个我还是没懂书中的代码为什么要这样= =。。。
Kunci kepada soalan ini terletak pada ayat ketiga dari bawah:
Oleh kerana benang berasingan dibuka di sini, anda mungkin tertanya-tanya, kenapa anda tidak boleh menggunakan
current_app
selepas membuka benang? betul! Hanya buka benang dan anda tidak boleh menggunakancurrent_app
. Sebabnya terletak pada pelaksanaancurrent_app
.
Saya tidak akan menerangkan secara terperinci tentang inicurrent_app
ialah proksi dalamFlask
Jika anda melihat kod sumberFlask
, anda akan mendapati bahawa ia sebenarnya dibalut seperti ini:Baris alamat kod sumber: 48-58
, tetapi saya boleh memberitahu anda bahawa fungsi
LocalProxy
ini adalah untuk mengembalikan objek yang sepadan dengan coroutine/benang semasa mengikut benang/coroutine, iaitu untuk mengatakanLocalProxy
dan
Jadi, inilah jawapannya, kerana benang baru dibuka di sini Jika anda tidak melalui objek sebenar, maka anda tidak akan dapat mendapatkan objek jika anda menggunakanFlask
boleh digunakan terus dalam kod dalamrequest
.current_app
dalam utas, kerana ia. tidak mempunyai
Boleh dikatakan penyoal sepatutnya dapat memahaminya.current_app
. Ini adalah satu lagi konsep penting Flask, terlalu banyak untuk dikatakan.flask 上下文
Saya melihat kod ini pada masa itu dan fikir ia adalah sama, tetapi mengapa tidak app=current_object?
Jadi lihat sekali lagi, maksud saya ialah perihalan dalam dokumen menyebut bahawa current_app ialah objek aplikasi global, dan current_app._get_current_object ialah objek get (dapatkan objek), serupa dengan kelas Staticmethod dan classmethod berikut. perkara yang berbeza (analogi ini tidak tepat, tetapi tidak sukar untuk mendapatkan apa yang saya maksudkan. Mereka sangat serupa sifatnya).
Lihat penjelasan jawapan ini:
Walau bagaimanapun, adalah salah untuk mengatakan ini. Sila lihat penjelasan _get_current_object
Kembalikan objek semasa Ini berguna jika anda mahu objek sebenar di belakang proksi pada satu masa atas sebab prestasi atau kerana anda ingin menghantar objek ke dalam konteks yang berbeza.
Apa yang ditulis di sini ialah objek sebenar
Adakah ini bermakna ini adalah contoh? Ia boleh difahami dengan cara ini, dan sudah tentu ia boleh menjadi lebih tepat.
Kerana tidak kira apa pun, adalah lebih baik untuk melihat kod sumber, kerana tidak kira apa itu, orang yang mereka bentuk rangka kerja boleh menukarnya dengan menulisnya secara terbalik
Sama ada ia adalah contoh atau objek, kaedah mereka pasti akan berbeza Lagipun, kod itu direka oleh orang, dan rangka kerja ini juga ditulis oleh orang ramai atau contoh, kerana saya rasa pada akhirnya ia tidak juga.