2014-04-08 17 views
13

Giả sử con đường sau đó truy cập vào một tập tin xml để thay thế các văn bản của một từ khóa cụ thể với một xpath nhất định (key =?):Flask dụ với POST

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

Sau đó, tôi sẽ sử dụng cURL như thế này:

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

các xpath expreesion listOfUsers/user1 nên truy cập vào thẻ <user1> để thay đổi văn bản hiện tại của mình để "John".

Tôi không biết làm thế nào để đạt được điều này bởi vì tôi chỉ mới bắt đầu học Flask và REST và tôi không thể tìm thấy bất kỳ ví dụ tốt cho trường hợp cụ thể này. Ngoài ra, tôi muốn sử dụng lxml để thao tác tệp xml vì tôi đã biết nó.

Ai đó có thể trợ giúp và cung cấp ví dụ để hướng dẫn tôi không?

Trả lời

21

Trước khi thực sự trả lời câu hỏi của bạn:

Các thông số trong một URL (ví dụ key=listOfUsers/user1) là GET thông số và bạn không nên sử dụng chúng cho POST yêu cầu. Có thể tìm thấy giải thích nhanh về sự khác biệt giữa GET và POST here.

Trong trường hợp của bạn, để tận dụng các nguyên tắc REST, có lẽ bạn nên có:

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

Sau đó, trên mỗi URL, bạn có thể xác định hành vi của các phương pháp khác nhau HTTP (GET, POST, PUT, DELETE). Ví dụ, trên /users/<user_id>, bạn muốn những điều sau:

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> 

Vì vậy, trong ví dụ của bạn, bạn muốn làm một POST-/users/user_1 với dữ liệu POST là "John". Sau đó, biểu thức XPath hoặc bất kỳ cách nào khác mà bạn muốn truy cập dữ liệu của mình sẽ bị ẩn khỏi người dùng và không liên kết chặt chẽ với URL. Bằng cách này, nếu bạn quyết định thay đổi cách bạn lưu trữ và truy cập dữ liệu, thay vì tất cả các URL của bạn đang thay đổi, bạn sẽ chỉ cần thay đổi mã trên phía máy chủ.

Bây giờ, câu trả lời cho câu hỏi của bạn: Dưới đây là một semi-giả cơ bản về cách bạn có thể đạt được những gì tôi đã đề cập ở trên:

@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 
     . 
     . 
     . 

Có rất nhiều những thứ khác để xem xét như POST yêu cầu loại nội dung nhưng tôi nghĩ rằng những gì tôi đã nói cho đến nay phải là một điểm khởi đầu hợp lý. Tôi biết tôi đã không trực tiếp trả lời câu hỏi chính xác mà bạn đã hỏi nhưng tôi hy vọng điều này sẽ giúp bạn. Tôi cũng sẽ thực hiện một số chỉnh sửa/bổ sung sau này.

Xin cảm ơn và tôi hy vọng điều này hữu ích. Xin vui lòng cho tôi biết nếu tôi đã nhận được một cái gì đó sai.

+0

làm bạn phải làm điều gì đó đặc biệt cho các POST để có được chuyển trở lại một cách chính xác?Tôi có/cuộc thi/ được thiết lập nhưng khi POST xảy ra, nó đăng lên/các cuộc thi thay vì vậy logic xử lý bài đăng của tôi không bao giờ đạt được. –

-4

Chỉ cần đặt dấu nháy kép trong URL, như thế này:

curl -X POST "http://ip:5000/resource?key=listOfUsers/user1" -d "John" 
Các vấn đề liên quan