Bes*_*ung 5 python django python-3.x python-asyncio pypputeer
我现在正在努力解决这个问题.我正在尝试使用pyppeteer以pdf格式导出视图.这是我的功能:
async def export_pdf(url):
browser = await launch()
page = await browser.newPage()
await page.goto(url)
pdf = await page.pdf(
{
'printBackground': True
}
)
await browser.close()
return pdf
Run Code Online (Sandbox Code Playgroud)
在我的观点中称之为:
response.content = asyncio.get_event_loop().run_until_complete(
export_pdf(self.request.get_full_path())
)
Run Code Online (Sandbox Code Playgroud)
但我得到了这个错误
/ export-pdf/1/2018/1/1的RuntimeError /线程'Thread-1'中没有当前事件循环.
经过一些研究,我认为有人解决了我的问题,我就这样称呼它(不太明白,但它是关于django和我的函数没有在主线程中调用的):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
response.content = loop.run_until_complete(
export_pdf(
asyncio.wait(
export_pdf(self.request.get_full_path())
)
)
)
loop.close()
Run Code Online (Sandbox Code Playgroud)
但现在我有这个错误:
/ export-pdf/1/2018/1/1 /上的TypeError期望一个期货清单,而不是协程
我对python中的async很新,事实上,当我在ipython shell中复制并粘贴完全相同的代码时,一切正常.
任何解释/光将不胜感激!
提前致谢.
编辑: 经过一些研究,我设法得到另一个错误,这是
信号仅在主线程中有效
奇怪的是,错误来自/usr/lib/python3.6/signal.py甚至来自我的virtualenv.
您的方法是正确的,只是有一个额外的asyncio.wait电话。只需执行以下操作:
coroutine = export_pdf(self.request.get_full_path())
# nothing is done yet, we need to give this coroutine to an event loop which will run it
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
data = loop.run_until_complete(coroutine)
finally:
loop.close()
response.content = data
Run Code Online (Sandbox Code Playgroud)