Ссылка для скачивания файла, динамически созданного Trac-Wikimacro - PullRequest
2 голосов
/ 08 июня 2011

Мне дали задание написать плагин для Trac.В нем должны быть представлены данные об исчерпании запасов и оценочные данные, хранящиеся в системе отслеживания ошибок.Пользователь пишет свой запрос как wikimacro и получает ссылку / кнопку для загрузки выгрузки в виде csv-файла, вывод в виде диаграммы также запланирован, но имеет более низкий приоритет.

У меня есть рабочийРешение для обработки данных, но я остался со следующей проблемой.

Мой вопрос

Как я могу предоставить ссылку на скачивание / - на вики-странице для файла, который динамически создается по запросу пользователя?

Я видел несколько попыток отправить файлы в самом источнике trac и других плагинах, но так как я новичок в веб-программировании, это не очень помогает.

Обновление1 Я пытался решить проблему так, как предложил Феликс, что открыло для меня новую проблему.Этот (глупый) пример должен продемонстрировать мою проблему.Мой макрос генерирует следующий URL и добавляет его в качестве ссылки на вики-страницу.

//http://servername.com/projectname/wiki/page_name?teddy=bear    

Но RequestHandler не реагирует, даже если условие возвращает true. Редактировать: Этот фрагмент кода теперь показывает рабочую версию для примера.

Новый URL:

#example url
#http://127.0.0.1:8000/prove/files/new

class CustomRequestHandlerModule(Component):
    implements(IRequestHandler)

    def match_request(self,req):
        #old, not working
        #return "teddy=bear"== str(req.path_info).split('?')[1]
        #new
        accept="/files/new"== str(req.path_info)
        return accept

    def process_request(self,req):
        csvfile = self.create_csv()
        req.send_response(200)
        req.send_header('Content-Type', 'text/csv')
        req.send_header('Content-length', len(csvfile))
        req.send_header('Content-Disposition','filename=lala.csv')
        req.end_headers()
        req.write(csvfile)
        raise RequestDone     

Update2 Вставка loggingstatements показывает, что match_request никогда не вызывается.

Что я делаю не так?(Да, create_csv () уже существует)

Обновление 3 Спасибо за помощь =)

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Если match_request не вызывается, то process_request никогда не имеет возможности выполнить. Предполагая, что с вашим плагином нет ничего плохого в том, что мешает Trac правильно загрузить его, вероятно, происходит то, что другой обработчик сопоставляет URL-адрес до вызова вашей версии match_request. Попробуйте увеличить уровень журнала до «Отладка» и посмотрите, предоставляет ли он достаточно информации, чтобы указать, кто обрабатывает этот запрос.

Другой вариант - создать собственное «пространство имен» для автоматически сгенерированных файлов. Попробуйте заменить «вики» в сгенерированных URL на что-то вроде «файлы». Это должно помешать любому из встроенных обработчиков обработать запрос до вызова метода match_request вашего плагина.

2 голосов
/ 09 июня 2011

В основном вам нужно написать свой собственный IRequestHandler, который обрабатывает определенный URL и возвращает ваши динамически созданные данные. После этого ваш макрос должен вернуть URL, который настроен для вашего обработчика запросов.

...