我在flask中编写了一个web应用程序,它显示从api中提取的公共汽车站。
我在index.html上有一个表单,用户可以在其中输入一个停止编号,该编号将在views.py中获取,其中该函数还通过芹菜运行一个任务来获取api数据:
from flask import render_template, request
from app import app
@app.route('/')
def index():
return render_template('index.html')
@app.route('/stopno', methods=['POST'])
def stopno():
stopid = request.form['input']
from app.tasks import apidata
apidata.delay()
return render_template('action.html')
这是我的任务
from celery import Celery
import json
import requests
import time
ac = Celery('tasks', broker='amqp://localhost')
@ac.task(name='tasks.apidata')
def apidata():
from views import stopno
api = '*apiurl*:' + str(stopid)
saveinfo = 'static/stop' + str(stopid)+ '.json'
r = requests.get(api)
jsondata = json.loads(r.text)
with open(saveinfo, 'w') as f:
json.dump(jsondata, f)
我正在将stopno从视图导入到任务中,这样我就可以在api中搜索指定的站点,当前,当用户输入站点号时,action.html加载良好,并显示用户输入的站点号,但没有为站点号创建新的文件或数据,并且芹菜抛出一个错误,称
ImportError: No module named views
我的项目结构是
|____run.py
|____app
| |______init__.py
| |____views.py
| |____tasks.py
| |____static
| | |____json
| |____templates
| | |____action.html
| | |____index.html
您正在尝试执行相对导入,但没有将其显式地设置为相对导入,这可能起作用,也可能不起作用,并可能导致意外错误。您应该使您的导入明确地与相关
from .views import stopno
这样,您就不必担心复制模块的整个路径。
from app.views import stopno
导入不适用,因为您正在尝试implicit relative import
这在python 2
中受支持,但在python 3
中不受支持。
试试这个:from .views import stopno
,这是python 3
支持的explicit relative import
如果这不起作用
尝试从以下视图导入所有内容:from .views import *
请永远记住,在python 3
中,import *
仅在模块级别上受支持,而在以下函数中不受支持:
@ac.task(name='tasks.apidata')
def apidata():
from .views import *
因此,如果您正在使用:from .views import *
,请确保将其设置为:
from celery import Celery
import json
import requests
import time
from .views import *
ac = Celery('tasks', broker='amqp://localhost')
@ac.task(name='tasks.apidata')
def apidata():
api = '*apiurl*:' + str(stopid)
saveinfo = 'static/stop' + str(stopid)+ '.json'
r = requests.get(api)
jsondata = json.loads(r.text)
with open(saveinfo, 'w') as f:
json.dump(jsondata, f)