2012-01-03 2 views
0

У меня есть приложение, которое отлично работает. Я пытаюсь запустить один из скриптов, если пользователь является администратором (мной). Вход администратора работает нормально, но затем я перенаправляюсь на страницу/геокод, и ничего не происходит. Я вижу ответ HTTP от 200.Сценарий не запускается после входа в систему как администратор, но работает нормально, если администратор не требуется

Любые предложения?

Благодаря

EDIT 2: Для того, чтобы добавить полный код по запросу.

app.yaml:

application: theapp 
version: 1 
runtime: python 
api_version: 1 

handlers: 

- url: /geocode 
    script: geocode.py 
    login: admin 

- url: /admin/.* 
    script: $PYTHON_LIB/google/appengine/ext/admin 
    login: admin 

- url: /favicon\.ico 
    static_files: static/images/favicon.ico 
    upload: static/images/favicon\.ico 

- url: /static 
    static_dir: static 

- url: /.* 
    script: first.py 
    secure: never 

builtins: 
- appstats: on 

inbound_services: 
- warmup 

first.py:

import os 

from beer import Beer 
from desktop import Desktop 
from geocode import Geocode 


from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 

application = webapp.WSGIApplication(
     [('/', Desktop), 
     ('/beer', Beer), 
     ('/geocode', Geocode)], 
     debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

geocode.py:

import pubs 
import os 
import time 


from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp import util 
from google.appengine.api import urlfetch 

import urllib 
import urllib2 
import simplejson 

class Geocode(webapp.RequestHandler): 
    '''Class for ./geocode 
    A couple of methods to take the address' from the Pubs.pub_address array 
    and turn them into usefull Latitudes & Longitudes. 
    ''' 
    def get_lat_long(self, location): 
     place = urllib.quote_plus(location) 
     print location 
     url = "http://maps.googleapis.com/maps/api/geocode/json?address=%s&sensor=true&region=no" % (place) 
     print url 
     out = urllib.urlopen(url) 
     jsonResponse = simplejson.load(out) 
     pub_location = jsonResponse.get('results')[0].get('geometry').get('location') 
     lat = pub_location.get('lat') 
     lng = pub_location.get('lng') 
     return lat, lng 

    def get(self): 
     pub_address = [] 
     pub_bounce = [] 
     self.response.headers['Content-Type'] = 'text/html; charset=utf-8' 
     path = os.path.join(os.path.dirname(__file__), 'templates') 
     path = os.path.join(path, 'geocode.html') 

     for i, element in enumerate(pubs.pub_list): 
      pub_bounce.append(pubs.pub_list[i].pub_bounce) 

     for i, element in enumerate(pubs.pub_list): 
      pub_address.append(pubs.pub_list[i].pub_address.encode('utf-8')) 

     for i, element in enumerate(pub_address): 
      pubs.pub_list[i].pub_lat, pubs.pub_list[i].pub_lng = self.get_lat_long(pub_address[i]) 
      print pubs.pub_list[i].pub_lat, pubs.pub_list[i].pub_lng 
      time.sleep(.2) 


     template_values = {"pub_address": pub_address, "pub_bounce": pub_bounce} 
     self.response.out.write(template.render(path, template_values)) 
+0

Не могу войти в систему/geocode быть логином: требуется, а не администратором? –

+0

Все, что вы можете предоставить наработки/геокодирование? –

+0

/geocode берет некоторый адрес из модели данных и превращает их в lat/lng. Как я уже упоминал, он отлично работает, если обработчик/геокод удален. «login: admin» предназначен для пользователей, которые вошли в систему и администраторов. «login: required» похоже только для любого пользователя, который вошёл в систему. – Gareth

ответ

1

Я думаю, что вам это нужно:

- url: /geocode 
    script: first.py 
    login: admin 

Сценарии ссылочные от app.yaml необходимости быть обработчик приложения (например, у run_wsgi_app и т.д. в них). geocode.py не является обработчиком приложения - это некоторый код, импортированный first.py.

+0

Спасибо. Это исправило это. – Gareth

1

ли передать ваши geocode.py переменные с помощью метода POST?

По моему опыту, при переадресации на страницу «входа» переменные, передаваемые методом POST, будут терять. (переменные, переданные GET, останутся) Тогда это приведет к тому, что ответ с 200, но ничего действительно не произойдет.

# app.yaml 
application: xxx 
version: 1 
runtime: python 
api_version: 1 


handlers: 
- url: /test\.html 
    static_files: test.html 
    upload: test.html 

- url:/
    login: admin 
    script: urls.py 
# urls.py 
from google.appengine.ext import db, webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 
import logging 

class Test(webapp.RequestHandler): 
    def get(self): 
     print "get" 
     print self.request.get("var") 

     logging.info("GET %s"%self.request.get("var")) 

    def post(self): 
     print "post" 
     print self.request.get("var") 

     logging.info("POST %s"%self.request.get("var")) 

application = webapp.WSGIApplication([ 
    (r'/', Test),]) 

def main(): 
    run_wsgi_app(application) 

#=============================================================================== 
# # it is necessary; otherwise, it will cause the server won't response 
# # at the first request which create a instance 
#=============================================================================== 
if __name__ == "__main__": 
    main() 


<!-- test.html --> 
<html> 
    <body> 
     <form method="POST" action="/"> 
      <input type="text" name="var" value="123"> 
      <input type="submit"> 
     </form> 
    </body> 
</html> 
+0

Я отредактировал свой вопрос, чтобы показать, что сценарий Geocode создает два списка, которые передаются в представление. нет POST там, но спасибо за то, что нашли время, чтобы помочь :) – Gareth