2014-04-08 13 views
13

Załóżmy następującą trasę, która uzyskuje dostęp do pliku xml, aby zastąpić tekst konkretnego tagu z danym XPath (klucz =?):przykład kolba z POST

@app.route('/resource', methods = ['POST']) 
def update_text(): 
    # CODE 

Następnie chciałbym użyć cURL tak:

curl -X POST http://ip:5000/resource?key=listOfUsers/user1 -d "John" 

XPath expreesion listOfUsers/user1 powinno dostęp tag <user1> zmienić swój obecny tekst "John".

Nie mam pojęcia, jak to osiągnąć, ponieważ dopiero zaczynam uczyć się Flascha i REST i nie mogę znaleźć żadnego dobrego przykładu dla tego konkretnego przypadku. Również chciałbym użyć lxml do manipulowania plikiem xml, ponieważ już go znam.

Czy ktoś może pomóc i podać przykład, który mnie poprowadzi?

Odpowiedz

21

Przed faktycznie odpowiadając na pytanie:

parametrów w adresie URL (np key=listOfUsers/user1) są GET parametry i nie należy używać ich do POST żądań. Szybkie wyjaśnienie różnicy między GET i POST można znaleźć here.

W twoim przypadku, aby skorzystać z zasadami REST, powinieneś mieć:

http://ip:5000/users 
http://ip:5000/users/<user_id> 

Następnie na każdym adresie URL, można zdefiniować zachowanie różnych metod HTTP (GET, POST, PUT, DELETE). Na przykład, na /users/<user_id>, chcesz, co następuje:

GET /users/<user_id> - return the information for <user_id> 
POST /users/<user_id> - modify/update the information for <user_id> by providing the data 
PUT - I will omit this for now as it is similar enough to `POST` at this level of depth 
DELETE /users/<user_id> - delete user with ID <user_id> 

Tak w przykładzie, chcesz zrobić POST do /users/user_1 z danymi POST będąc "John". Następnie wyrażenie XPath lub jakikolwiek inny sposób uzyskania dostępu do danych powinien być ukryty przed użytkownikiem, a nie ściśle powiązany z adresem URL. W ten sposób, jeśli zdecydujesz się zmienić sposób przechowywania i dostępu do danych, zamiast zmieniania adresu URL, będziesz musiał po prostu zmienić kod po stronie serwera.

Teraz odpowiedź na swoje pytanie: Poniżej jest podstawowym semi-pseudokod, w jaki sposób można osiągnąć to, co wspomniałem powyżej:

@app.route('/users/<user_id>', methods = ['GET', 'POST', 'DELETE']) 
def user(user_id): 
    if request.method == 'GET': 
     """return the information for <user_id>""" 
     . 
     . 
     . 
    if request.method == 'POST': 
     """modify/update the information for <user_id>""" 
     # you can use <user_id>, which is a str but could 
     # changed to be int or whatever you want, along 
     # with your lxml knowledge to make the required 
     # changes 
     data = request.form # a multidict containing POST data 
     . 
     . 
     . 
    if request.method == 'DELETE': 
     """delete user with ID <user_id>""" 
     . 
     . 
     . 
    else: 
     # POST Error 405 Method Not Allowed 
     . 
     . 
     . 

Istnieje wiele innych rzeczy do rozważenia jakby POST Żądaj typu zawartości, ale myślę, że to, co powiedziałem do tej pory, powinno być rozsądnym punktem wyjścia. Wiem, że nie odpowiedziałem bezpośrednio na dokładne pytanie, które zadawałeś, ale mam nadzieję, że ci to pomoże. Później wprowadzę pewne zmiany/dodatki.

Dzięki i mam nadzieję, że to będzie pomocne. Proszę, daj mi znać, jeśli popełniłem błąd.

+0

masz zrobić coś specjalnego dla testu POST, aby prawidłowo kierowane z powrotem?Mam/competitions/ skonfigurowany, ale kiedy pojawi się POST, wysyła on do/competitions, więc moja logika obsługi postów nigdy nie zostanie osiągnięta. –

-4

Wystarczy umieścić cudzysłów w adresie URL, na przykład:

curl -X POST "http://ip:5000/resource?key=listOfUsers/user1" -d "John"