2016-09-21 167 views
0

我有一个小型django项目,我试图从我的views.py中传递一个变量到tasks.py并使用该变量运行一个任务,但我得到的名称不是定义的错误,我已经尝试了许多解决方案,我见过的其他问题,但我似乎无法得到它的工作NameError:未定义全局名称'query'

这里是我的views.py

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
from django.shortcuts import render, loader 
from django.template import Context 
from django.http import HttpResponse 
import json 
import requests 
from tasks import rti 

def index(request): 
    return render(request, 'bus/index.html') 

def search(request): 
    query = request.GET.get('q') 
    t = loader.get_template('bus/search.html') 
    c = Context({ 'query': query,}) 
    rti() 
    return HttpResponse(t.render(c)) 

这里是我的tasks.py

from background_task import background 
import time 


@background(schedule=1) 
def rti(): 
    timeout = time.time() + 60 * 15 
    while time.time() < timeout: 
     from views import search 
     dblink = '*apiurl*' + str(query) + '&format=json' 
     savelink = 'bus/static/bus/stop' + str(query)+ '.json' 
     r = requests.get(dblink) 
     jsondata = json.loads(r.text) 
     with open(savelink, 'w') as f: 
      json.dump(jsondata, f) 

这里是追溯:

Traceback (most recent call last): 
    File "/Users/dylankilkenny/dev/python/test2/lib/python2.7/site-packages/background_task/tasks.py", line 49, in bg_runner 
    func(*args, **kwargs) 
    File "/Users/dylankilkenny/dev/python/test2/mysite/bus/tasks.py", line 9, in rti 
    from views import search 
NameError: global name 'query' is not defined 

回答

0

你必须改变你的方法的定义,以def rti(query):,并考虑rti(query)使用它,因为你的后台任务不知道里面查询变量什么。

0

您需要修改您的任务,以便将查询作为参数。

@background(schedule=1) 
def rti(query): 
    ... 

,当你调用任务在你看来

rti(query) 
+0

香港专业教育学院尝试这样做,得到这个错误:'类型错误:RTI()不带任何参数(1给出)' –

+0

这听起来好像该方法尚未更新为“def rti(query)”。确保您已重新启动正在运行任务的进程。 – Alasdair

0

你没有通过任何参数的方法rti()已呼叫内views.py然后通过查询。为此,在定义中的方法rti()时,该方法应该采用查询之类的参数。之后,您将可以在rti()内使用query

请按照下列:

tasks.py:

@background(schedule=1) 
def rti(query): 
    {...your code} 

views.py:

def search(request): 
    query = request.GET.get('q') 
    t = loader.get_template('bus/search.html') 
    c = Context({ 'query': query,}) 
    rti(query)  #calling rti from tasks.py passing the argument 
    return HttpResponse(t.render(c)) 
相关问题