$ post и Cherrypy - PullRequest
       16

$ post и Cherrypy

0 голосов
/ 29 июня 2011

В настоящее время я работаю над проектом, в котором мы ранее использовали Django.Однако это оказалось немного тяжелым для наших нужд, поэтому мы перекладываем проект на использование cherrypy, поскольку нам действительно нужно обрабатывать запросы.

Моя проблема заключается в следующем.У меня есть форма на html-странице (index.html), когда пользователь нажимает кнопку «Отправить», и выполняется следующая функция jQuery.

$(document).ready(function() {
    $("#loginform").submit(function() {
        var request_data = {username:$("#username").val(),password:"test"};
        $.post('/request',request_data, function(data) {
                                        $("#error").html(data['response']);
        });
        return false;
    });
});

Это отлично работает.Следующий метод Cherrypy должен получить данные запроса, но они не выполняются.Вот метод Cherrypy для запроса.

@cherrypy.expose
def request(self, request_data):
    print "Debug"
    cherrypy.response.headers['Content-Type'] = 'application/json'
    return simplejson.dumps(dict(response ="Invalid username and/or password"))

Это всего лишь тестовый метод, и я ожидаю увидеть «Отладка» в окне терминала и сообщение об ошибке, отображаемое на веб-странице посленажата кнопка отправки

В терминале я получаю это сообщение после выполнения запроса:

"POST /request HTTP/1.1" 404 1254 "http://127.0.0.1:8080/" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; en-us) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"

Это будет означать, что он не может найти метод запроса.Все, что я могу подумать, это что-то делать с параметром.

Поскольку я новичок в cherrypy, я ожидаю, что это просто, что я пропускаю любые указатели, было бы замечательно.Следующее работает, но мне нужно иметь возможность передавать несколько данных в cherrypy.(Параметр cherrypy изменен на username, чтобы это работало)

$(document).ready(function() {
    $("#loginform").submit(function() {
        $.post('/request',{username:$("#username").val()}, function(data) {
                                        $("#error").html(data['response']);
        });
        return false;
    });
});

Заранее благодарен за любую помощь или руководство в этом вопросе.

Вот мой полный файл cherrypy.

import cherrypy
import webbrowser
import os
import simplejson
import sys
from backendSystem.database.authentication import SiteAuth

MEDIA_DIR = os.path.join(os.path.abspath("."), u"media")

class LoginPage(object):
@cherrypy.expose
def index(self):
    return open(os.path.join(MEDIA_DIR, u'index.html'))

@cherrypy.expose
def request(self, request_data):
    print "Debug"
    cherrypy.response.headers['Content-Type'] = 'application/json'
    return simplejson.dumps(dict(response ="Invalid username and/or password"))


config = {'/media': {'tools.staticdir.on': True, 'tools.staticdir.dir': MEDIA_DIR, }}

root = LoginPage()

# DEVELOPMENT ONLY: Forces the browser to startup, easier for development
def open_page():
webbrowser.open("http://127.0.0.1:8080/")
cherrypy.engine.subscribe('start', open_page)

cherrypy.tree.mount(root, '/', config = config)
cherrypy.engine.start()

1 Ответ

6 голосов
/ 06 июля 2011

Я нашел решение этой проблемы. JQuery:

$(document).ready(function() {
$("#loginform").submit(function() {
    $.post('/request',{username:$("#username").val(),password:"test"}, function(data) {
                                    $("#error").html(data['response']);
    });
    return false;
});

}); Затем в методе вишни я делаю это:

def request(self, **data):
    # Then to access the data do the following
    print data['<keyValue'] # In this example I would type print data['username']

Просто на самом деле, случай, когда невозможно увидеть дерево за деревьями. Надеюсь, это поможет кому-то еще.

...