2016-05-17 7 views
0

Я пытаюсь использовать бутылку для обновления информации на сайте, загружаемом из команд в бот-чате, но изо всех сил пытаюсь получить информацию от одного маршрута к другому, проверяя, определены ли переменные.Проверка, определены ли глобальные переменные в бутылке

Он работает отлично, пока я не добавил:

if 'area' not in globals(): 
     area = '' 
    if 'function' not in globals(): 
     function = '' 
    if 'user' not in globals(): 
     user = '' 
    if 'value' not in globals(): 
     value =''` 

Чтобы проверить, если переменная была определена. Он работает, если я не установил значение, используя/in. в противном случае это ошибки с

Traceback (most recent call last): 
File "/usr/local/lib/python3.5/dist-packages/bottle.py", line 862, in _handle 
return route.call(**args) 
File "/usr/local/lib/python3.5/dist-packages/bottle.py", line 1732, in wrapper 
rv = callback(*a, **ka) 
File "API.py", line 43, in botOut 
return area + function + user + value 
UnboundLocalError: local variable 'area' referenced before assignment 

Полный код:

from bottle import route, error, post, get, run, static_file, abort, redirect, response, request, template 
Head = '''<!DOCTYPE html> 
    <html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <link rel="stylesheet" href="style.css"> 
    <script src="script.js"></script> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
    </head> 
    ''' 

foot = '''</body></html>''' 

@route('/in') 
def botIn(): 
    global area 
    global function 
    global user 
    global value 
    area = request.query.area 
    function = request.query.function 
    user = request.query.user 
    value = request.query.value 
    print(area) 
    return "in" 


@route('/out') 
def botOut(): 
    if 'area' not in globals(): 
     area = '' 
    if 'function' not in globals(): 
     function = '' 
    if 'user' not in globals(): 
     user = '' 
    if 'value' not in globals(): 
     value ='' 
return area + function + user + value 

run (host='0.0.0.0', port=8080) 

ответ

0

Вместо использования 4 глобалам - что вы тогда должны квалифицироваться с global ключевого слова в нескольких местах - просто создать один Dict в модуле уровень и сохранить ваше состояние в этом dict; нет необходимости объявлять его global в любом месте.

Например,

bot_state = { 
    'area': '', 
    'function': '', 
    'user': '', 
    'value': '' 
} 


@route('/in') 
def botIn(): 
    bot_state['area'] = request.query.area 
    bot_state['function'] = request.query.function 
    bot_state['user'] = request.query.user 
    bot_state['value'] = request.query.value 
    print(area) 
    return 'in' 


@route('/out') 
def botOut(): 
    return ''.join(
     bot_state['area'], 
     bot_state['function'], 
     bot_state['user'], 
     bot_state['value'], 
    ) 

Обратите внимание, что есть еще несколько улучшений я бы сделать в коде (например, каждая функция маршрута должен возвращать список строк, а не строка), а те минимальные изменения Я бы сделал, чтобы решить вашу непосредственную проблему. Надеюсь, поможет!