2014-12-18 6 views
1

Использование Flask и Python У меня есть сайт, работающий на localhost, который позволяет пользователю выбрать определенный месяц для загрузки отчет для. Исходя из выбранного месяца, я буду импортировать импортированный файл веб-скрепок, который извлекает данные с другого сайта (требуется вход в систему). В моем скрипте scarping используется Mechanize.Невозможно выполнить скрипт веб-скребка python успешно после того, как пользователь отправит форму на веб-сайт, созданный с помощью Flask со второго раза.

Вот часть кода, где мой веб-соскоб файл (webscrap.py) импортируется после того, как кнопка загрузки нажата (выбор делается на office.html):

@app.route('/office/', methods=['GET','POST']) 
def office(): 
    form=reportDownload() 
    if request.method=='POST': 
     import webscrap 
     return render_template('office.html', success=True) 
    elif request.method=='GET': 
     return render_template('office.html', form=form) 

В render_template методе , success = True передается как аргумент, так что мой скрипт office.html отобразит сообщение об успешном завершении, если нет (когда это запрос GET), он отобразит форму для выбора пользователя. Вот мой сценарий для office.html:

{% extends "layout.html" %} 
{% block content %} 
    <h2>Office</h2> 
    {% if success %} 
    <p>Report was downloaded successfully!</p> 
    {% else %} 
    <form action="{{ url_for('office') }}" method="POST"> 
     <table width="70%" align="center" cellpadding="20"> 
     <tr> 
     <td align="right"><p>Download report for: </p></td> 
     <td align="center"><p>Location</p> 
        {{form.location}}</td> 
     <td align="center"><p>Month</p> 
          {{form.month}} </td> 
     <td align="center"><p>Year</p> 
          {{form.year}} </td> 
     </tr> 
     <tr> 
     <td></td> 
     <td></td> 
     <td></td> 
     <td align="center">{{form.submit}} </td> 
     </tr> 
    </table> 
    </form> 
    {% endif %} 
{% endblock %} 

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

В моем веб-соскоб сценарий, используя механизацию и cookiejar, у меня есть несколько строк кода в начале:

br = mechanize.Browser() 
    cj = cookielib.LWPCookieJar() 
    br.set_cookiejar(cj) 

и я приступаю с веб выскабливание.

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

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

Спасибо заранее!

ответ

1

Как только приложение Flask запущено, он импортирует только каждый пакет один раз. Это означает, что когда он во второй раз работает в import webscrap, он говорит: «Ну, я уже импортировал это ранее, поэтому не нужно предпринимать дальнейшие действия ...» и переходит к следующей строке, создавая шаблон без фактического запуска скрипта.

В этом смысле import в Python не то же самое, как require для других языков (например, PHP, кстати, было бы ближе к require_once в PHP).

Решение было бы сделать ваш скребок объектом (class) и создавать его каждый раз, когда вам это нужно. Затем вы перемещаете импорт в верхнюю часть файла, а внутри if request.method=='POST' вы просто создаете новый экземпляр вашего веб-скребка.

+1

Большое спасибо @cuducos, это работает сейчас! :) и спасибо за объяснение проблемы и решения так ясно! – ctyneg