Как сделать файл, который на локальном сервере доступен для загрузки через HTTP в python? - PullRequest
1 голос
/ 20 сентября 2010

Каркас: Джанго Язык: Python ОС: Ubuntu

Например, давайте предположим, что у меня есть файл "xyz.pdf" в "/ home / username / project /". У меня есть веб-страница с кнопкой загрузки. Поэтому, если люди нажмут на эту кнопку загрузки, файл xyz.pdf должен быть загружен.

Что я сделал,

  1. Создана веб-страница с кнопкой загрузки с href как «download /» (как вы все знаете, этот URL не имеет большого значения)
  2. он перенаправляется в urls.py и находит соответствующее представление, например, "xyzdownload"
  3. при xyzdownload у меня есть следующий код, response = urllib2.urlopen ('./ project / xyz.pdf') html = response.read ()

Я получаю ошибку: неизвестный тип URL: ./project/xyz.pdf

Пожалуйста, дайте мне знать, если вам, ребята, нужно больше разъяснений. Большое спасибо

Ответы [ 3 ]

1 голос
/ 20 сентября 2010

Как правило, вы хотите просто разместить файл в Apache и т. Д. И указать ссылку на местоположение.Если файл генерируется динамически или вы хотите «поставить его под эмбарго», вот как вы можете это сделать с cherrypy :

@cherrypy.expose
def download(self, filename):
    """
    Download the specified XML file
    """

    # only if it's one of these files
    if filename not in "foo.xml bar.xml".split():
        return "Nice try"

    content = open("/path/to/media/" + filename).read()

    cherrypy.response.headers['Content-Type'] = 'application/xml'
    cherrypy.response.headers['Content-Length'] = len(content)
    disp = 'attachment; filename=%s' filename
    cherrypy.response.headers['Content-Disposition'] = disp
    cherrypy.response.headers['filename'] = 'application/xml'
    cherrypy.response.headers['pragma'] = ""
    cherrypy.response.headers['content-cache'] = ""

    return content

Ссылка будет выглядеть следующим образом:

http://example.com/download/foo.xml
0 голосов
/ 22 сентября 2010

вы можете попробовать механизировать клики по тексту и ссылаться на подписчиков, перегрузив его

import mechanize

br = mechanize.Browser()

# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

# Want debugging messages?
#br.set_debug_http(True)
#br.set_debug_redirects(True)
#br.set_debug_responses(True)

# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

# Download xyz.pdf ;)
f = br.retrieve('http://www.site.com/xyz.pdf')[0]
print f
fh = open(f)

# or you may try with click download just uncomment
# br.click_link(text_regex="download")

# or by url regex
# br.click_link(url_regex="project/xyz.pdf", nr=0)

и посмотрите огромный ресурс и учебник здесь http://wwwsearch.sourceforge.net/mechanize/

0 голосов
/ 20 сентября 2010

Я получаю ошибку: неизвестный тип URL: ./project/xyz.pdf

Все просто: ./project/xyz.pdf равен , а не URL. Википедия говорит:

Каждый URL состоит из следующих элементов: имя схемы (обычно называемое протоколом), затем двоеточие, затем, в зависимости от схемы, имя хоста (в качестве альтернативы - IP-адрес), номер порта, путь к ресурсу, который нужно получить, или к программе, которую нужно запустить, а затем для таких программ, как сценарии Common Gateway Interface (CGI), строка запроса, а с документами HTML - привязка.(необязательно), где должна отображаться страница.

Вы не указали имя схемы и имя хоста .Однако я не понимаю, зачем ты это делаешь.Вызов urlopen означает: загрузите этот файл на my pc.Это не означает «передать файл пользователю».

Кстати, представление xyzdownload должно быть определено как @Ryan Ginstrom Предлагаемый вам .Конечно, вы должны адаптировать код для Django.

Чтобы прочитать некоторые примеры, посмотрите здесь .И, конечно, вы должны прочитать этот вопрос, потому что он почти такой же, как и вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...