2016-09-21 26 views
0

私は小さなdjangoプロジェクトを持っていて、私のviews.pyの変数をtasks.pyに渡して変数を使ってタスクを実行しようとしていますが、定義されたエラー、IVEは、多くのソリューションは、他の質問で見アイブ試みたが、私はそれが仕事を得るように見えることはできませんここ 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

タスクを変更して、クエリを引数として使用する必要があります。あなたはあなたがviews.py内部で呼び出されているメソッドrti()に任意の引数を渡されていない

rti(query) 
+0

は、IVEはこれを試してみました。このエラーを得た: 'TypeError例外:RTI()は引数を取りません(1件) ' –

+0

メソッドが' def rti(query) 'に更新されていないかのように聞こえます。タスクを実行しているプロセスを再起動したことを確認してください。 – Alasdair

0

ビューでタスクを呼び出すとき

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

その後、クエリを渡します。そしてそれを行うには、メソッドrti()tasks.pyの中に定義する一方、メソッドはクエリのような引数を取るべきです。その後、queryrti()の中に使用することができます。

これらに従ってください:

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)) 
関連する問題