0

Tornado Framework を使用して Web サービスを作成しようとしています。システムは、次のような URL を処理することになっています。

IP:Port/?user=1822&catid=48&skus=AB1,FS35S,98KSU1

最初に、URL を読み取るために次のコードを作成しました。

#!/usr/bin/env python

from datetime import date
import tornado.httpserver
import tornado.escape
import tornado.ioloop
import tornado.web

class WService(tornado.web.RequestHandler):
    def get(self, url):
        self.write("value of url: %s" %(url))

application = tornado.web.Application([
    (r"/([^/]+)", WService)])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(9000)
    tornado.ioloop.IOLoop.instance().start()

URLを入力します:

IP:Port/hello_world

をもたらしました:

value of url: hello_world

"?" を除いて、URL で使用されているすべての文字が機能します。次のようなコードを変更する場合:

application = tornado.web.Application([
        (r"/?([^/]+)", WService)])

「?」でURLを送信しました マーク ( IP:Port/?hello_world) 結果は次のとおりです。

404: Not Found

この問題を解決するためにトルネードについて調べたところ、次のget_argumentような方法を見つけて適用しようとしました。

class WService2(tornado.web.RequestHandler):
    def get(self):
        user = self.get_argument('user', None)   
        respose = { 'user': user }   
        self.write(response)

application = tornado.web.Application([
    (r"/", WService2),   
])

しかし、URL を送信すると次のようIP:Port/user=5に返されます。

404お探しのページが見つかりませんでした

私も試しました:

application = tornado.web.Application([
    (r"/(\w+)", WService2),   
])

また:

application = tornado.web.Application([
    (r"/([^/]+)", WService2),   
])

何も機能しませんでした。

「?」でURLを読むのに何か間違っていますか?Tornado がこのようなパラメータを含む URL を読み取らない理由はありますuserか? 何か足りないものはありますか?

Tornado を最新バージョンに更新しましたが、同様に機能しませんでした。

さらに詳しい情報が必要な場合や不明な点がある場合は、お知らせください。

前もって感謝します、

4

1 に答える 1

5

文字列全体が表示されないのは、Tornado が既に文字列を解析してrequest オブジェクトに配置しているためです。クエリ文字列を含むパス全体を見たい場合は、request.uriを見てください。

あなたの例では、に行く場合http://localhost:9000/hello_world?x=10&y=33request.uriはに設定され/hello_world?x=10&y=33ます。

ただし、あなたが述べているように、引数を調べるにはget_argument (またはget_arguments ) を使用することをお勧めします。これがあなたの例であり、それらをどのように読むことができるかを示すために拡張されています。

に行ってhttp://localhost:9000/distance?x1=0&y1=0&x2=100&y2=100、何が返されるかを確認してください。

同様に、試してみてくださいhttp://localhost:9000/?user=1822&catid=48&skus=AB1,FS35S,98KSU1。これで期待どおりに動作するはずです。

#!/usr/bin/env python

import math
import tornado.httpserver
import tornado.escape
import tornado.ioloop
import tornado.web


class DistanceService(tornado.web.RequestHandler):
    def get(self):
        x1 = float(self.get_argument('x1'))
        y1 = float(self.get_argument('y1'))
        x2 = float(self.get_argument('x2'))
        y2 = float(self.get_argument('y2'))
        dx = x1 - x2
        dy = y1 - y2
        magnitude = math.sqrt(dx * dx + dy * dy)
        self.write("the distance between the points is %3.2f" % magnitude)


class WService(tornado.web.RequestHandler):
    def get(self):
        self.write("value of request.uri: %s" % self.request.uri)
        self.write("<br>")
        self.write("value of request.path: %s" % self.request.path)
        self.write("<br>")
        self.write("value of request.query: %s" % self.request.query)


application = tornado.web.Application([
    (r"/distance", DistanceService),
    (r"/", WService),
])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(9000)
    tornado.ioloop.IOLoop.instance().start()
于 2013-10-20T17:58:26.153 に答える