Как обнаружить HTTP-запрос на возврат изображения (в HTML-код) - PullRequest
0 голосов
/ 10 июля 2019

Мой сервер предоставляет скрипт wsgi.py для встраивания приложения Python.Мне нужно заполнить функцию приложения (environment, start_response) для ответа на HTTP-запросы.Я мог бы управлять запросами GET и POST (как показано в коде ниже).Но в html-коде, который я возвращаю для запроса GET, у меня есть <img src='images/mypicture.png' />, и изображение НЕ отображается в первом раунде.

Я использовал Bottle для локального разработчика, и это было сделано с помощью конкретного ответадля запросов данных изображений.Но на внешнем сервере (Apache, Python 3.7) у меня нет доступа к Bottle, и мне нужно написать простой код wsgi.Как я могу обнаружить запрос на изображение, чтобы я мог вернуть правильный заголовок и данные?Я могу управлять запросами GET и POST, но не могу определить, когда требуется изображение.

def my_get_post_form(environ):
    # Simple way to retrieve the POST form data (works fine on my server)
    input = environ['wsgi.input']
    nSize = int(environ['CONTENT_LENGTH'])
    sBuf = input.read(nSize)
    return(sBuf)

def application(environ, start_response):    

    sMethod = environ['REQUEST_METHOD']
    sParam = environ['QUERY_STRING'].split("&")
    sPath = environ['PATH_INFO']
    sFull = environ['SCRIPT_NAME']

    # It does NOT detect an image request...
    if '.png' in sFull:        
        data = open(sFull, 'rb').read()
        start_response('200 OK', [('Content-Type', 'image/png'),
                                  ('content-length', str(len(data)))])
        return(data)

    # This works : I return html code with <img /> tags inside
    # This html code includes a form
    if sMethod.upper() == "GET":
        start_response('200 OK',[('Content-Type','text/html; charset=utf-8')])
        return ['<!DOCTYPE html><html><meta charset="utf-8">',
                sHtmlD.encode('utf-8'),
                sFormExterne.encode('utf-8'),
                sHtmlF.encode('utf-8')]

    # This works too, to retrieve the form data, make some computations
    # and return the result in an html page
    if sMethod.upper() == "POST":
        sParam = str(my_get_post_form(environ)).split("&")
        ... some computations ...
        start_response('200 OK',[('Content-Type','text/html; charset=utf-8')])
        return ['<!DOCTYPE html><html><meta charset="utf-8">'.encode('utf-8'),
                sHtmlD.encode('utf-8'),
                sStats.encode('utf-8'),
                sHtmlF.encode('utf-8')]

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

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Я нашел это!
Это было довольно просто на самом деле ...
(что не означает, что его легко найти :-)) Итак, вот код, и я подтверждаю, что, как только вы вернулиHTML-файл для запроса GET, и этот HTML-файл содержит теги img, вы получите столько запросов, сколько у вас изображений для извлечения
Просто нужно определить, что запрос ожидает изображение, вот как:

import wsgiref, wsgiref.util # Maybe just environment['PATH_INFO'] returns the same...
def application(environ, start_response):    
    sMethod = environ['REQUEST_METHOD']
    sParam = environ['QUERY_STRING'].split("&")
    sPath = environ['PATH_INFO']
    sFile = wsgiref.util.request_uri(environ, include_query=True)   
    # Asking for a complementary image mentioned in the html file returned in GET
    if '.png' in sFile:
        sImage = sFile[sFile.find("images/"):]  # If your images are in images folder      
        data = open(sImage, 'rb').read()
        start_response('200 OK', [('Content-Type', 'image/png'),
                                  ('content-length', str(len(data)))])
        return(data)

    if sMethod.upper() == "GET":
    ....
0 голосов
/ 10 июля 2019

Вы можете подавать статические изображения из корня документа apache или использовать «Псевдоним».

https://httpd.apache.org/docs/2.4/urlmapping.html#documentroot

...