2015-03-06 3 views
0

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

Я хочу, чтобы файл передавался в представления (views.py), который, в свою очередь, вызывал бы функцию внутри скрипта initializedb.py. Я хочу только , чтобы функция выполнялась, а не весь скрипт initializedb.py (который включает в себя многочисленные вставки). Моя инициализируемая функция БД принимает файл .csv в качестве входных данных и вставляет его содержимое в базу данных.

Мой вопрос: Как мне вызвать функцию, которая находится внутри initializedb.py через мои представления?

в моем шаблоне: -

$.post(
    "{{request.route_url('passer_view')}}", // view that should invoke the insert function 
    {'data': filecontents} //file contents will be my global variable that holds the contents of the file 
); 

мой views.py:-

@view_config(route_name='passer_view' renderer="mytem.pt") 
def insert(request): 
    data = request.POST["data"] 
    csvify_data(data) #this function makes renames the data into a csv file 
    ###i should invoke the initializedb.py function here 
    return HTTPFound(location=...) 

мой initializedb.py:-

def main(argv=sys.argv): 
    #a whole load of engine creation and stuffs 
    with transaction.manager: 
     def insertfunction(csvfile): 
      DBSession.add(...) 

Как это может быть сделано есть ли другой способ делать то, что я делаю? Любая идея ценится. Спасибо заранее.

ответ

1

Похоже, вам нужно реструктурировать свой initializedb.py. Функция, определенная внутри другой функции, недоступна извне. Лучше определить их на уровне модуля и просто вызвать их внутри своей основной функции: затем вы также можете импортировать их и вызывать их из другого места.

+0

Я как-то понял. Теперь я должен просто поместить эти функции за пределы моего initializedb в другой .py-файл, а затем импортировать функцию в мои представления? – Tania

+1

Вы можете сделать это, или вы можете просто разместить их на верхнем уровне внутри initializedb, если они находятся вне основной функции. –

+0

Хорошо, я тебя. Но в таком случае я должен создать экземпляр другого менеджера транзакций? как с transaction.manager: выше основной функции? – Tania