Как ответить на ajax в простом приложении wsgi? - PullRequest
1 голос
/ 02 июля 2019

в учебных целях я пытаюсь сделать простое приложение wsgi, нужна помощь с несколькими вопросами. Заранее спасибо всем, кто ответит!
У меня есть следующий код:

from wsgiref.simple_server import make_server
import re


def collectTemplate(body):
    header_html = open('templates/header.html', encoding='utf-8').read()
    footer_html = open('templates/footer.html', encoding='utf-8').read()
    html = header_html + body + footer_html
    return html.encode('utf-8')

def indexPage(environ, start_response):
    path = environ.get('PATH_INFO')
    print(path)
    status = '200 OK'
    headers = [("Content-type", "text/html; charset=utf-8")]
    start_response(status, headers)
    body = """
        <h1>Hello index</h1>
        <div class='send'>Send ajax</div>
        <script>
            $('.sjd').on('click', function(){
                $.ajax({
                    type: 'POST',
                    dataType: 'json',
                    data: {'data': 'hello'},
                    url: 'ajax.py',
                    success: function (msg) {
                        console.log(msg)
                    },
                    error : function (msg){
                        console.log(msg)
                    }
                });
            });
        </script
        """
    html = collectTemplate(body)
    return [html.encode('utf-8')]

def anotherPage(environ, start_response):
    status = '200 OK'
    headers = [("Content-type", "text/html; charset=utf-8")]
    start_response(status, headers)
    body = "<h1>Hello another page</h1>"
    html = collectTemplate(body)
    return [html.encode('utf-8')]

def page404(environ, start_response):
    start_response('404 NOT FOUND', [('Content-Type', 'text/html')])
    return ['Not Found']

urls = [
    (r'^$', indexPage),
    (r'another/?$', anotherPage),
]

def application(environ, start_response):
    path = environ.get('PATH_INFO', '').lstrip('/')
    for regex, callback in urls:
        match = re.search(regex, path)
        if match is not None:
            environ['url_args'] = match.groups()
            return callback(environ, start_response)
    return page404(environ, start_response)

if __name__ == '__main__':
    srv = make_server('', 8000, application)
    srv.serve_forever()

Вопрос 1) Самое главное, как реализовать ajax и ответить на него? Буду очень признателен за примеры. Я попытался в ajax.py следующий код, но он не дал результата

import cgi
storage = cgi.FieldStorage()
data = storage.getvalue('data')
print('Status: 200 OK')
print('Content-Type: text/plain')
print('')
if data is not None:
    print(data)

Вопрос 2) При запуске появляются две страницы (127.0.0.1:8000) и (127.0.0.1:8000/another/), когда все переключается, но консоль получает ошибку. почему это происходит?

File "C:\Python\Python37-32\lib\wsgiref\simple_server.py", line 35, in close
self.status.split(' ',1)[0], self.bytes_sent
AttributeError: 'NoneType' object has no attribute 'split'

Ответы [ 2 ]

1 голос
/ 02 июля 2019

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

import cgi

def handle_ajax(environ, start_response):
  storage = cgi.FieldStorage()
  data = storage.getvalue('data')
  print('Status: 200 OK')
  print('Content-Type: text/plain')
  print('')
  if data is not None:
    print(data)


urls [..., (r'ajax', handle_ajax)]

Что касается вашего второго вопроса, это действительно странно. Похоже, что self.status равно None, хотя для него должно быть установлено значение status, которое вы передаете в start_response. Можете ли вы расширить свой вопрос с помощью большего количества стековых трасс? Также, возможно, попробуйте передать именованные аргументы start_response(status=status, headers=headers)

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

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

 def ajax(environ, start_response): 
        start_response('200 OK', [('Content-Type', 'text/json')])
        json_string = json.dumps({'status':'ok'})
        return [json_string.encode()]
...