【问题标题】:Tornado get input from URL requestTornado 从 URL 请求中获取输入
【发布时间】:2018-01-11 07:19:33
【问题描述】:

我的程序是从 web 和我的 tornado API 中获取参数(URL),我想一一接受它们。现在我的代码接受一个元组。我的 api 想要获取来自 web URL 请求的 4 个参数(south-lat、south-long、east-lat、east-long)。我会将它们实现到 Tornado 的 get 方法中,并在我的数据库中找到它们。我想知道如何在龙卷风中分别接受它们。这是我目前的工作代码。

import socket
import tornado.web
from datetime import datetime
import pymongo
from pymongo import MongoClient
from pprint import pprint
import tornado.httpserver
import tornado.ioloop
import tornado.options
from tornado.options import define,options

#apicall/v1/geoloc.json?geoquery=True&southwest_lat=''&southwest_lng=''&northeast_lat=''&northeast_lng=''

#tornado port
port = 8088
host = "127.0.0.1"

#make a connection with mongodb
#client=MongoClient()

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("hello APIs")

#what this works is here   
class VisualizationHandler(tornado.web.RequestHandler):
    def get(self,*args):#how to accept the input from map?


        self.open_args=args
        #self.open_kwargs=kwargs

        print(self.open_args)
        print(type(self.open_args))

        #self.write("Data is at the terminal")
        #client = MongoClient("mongodb://localhost:27017")
        #db=client.test
        #docs=db.neighborhoods.findOne()
        #if docs is None:
            #print("Not found")
        #else:
            #print(docs)

            #lat=self.get_argument('lat',True)
            #long=self.get_argument('long',True)
            #self.write(lat)
            #self.write(long)



        #var neighborhood = db.neighborhoods.findOne( { geometry: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ slong, slat] } } } } )

def main():
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/geo/(.*)",VisualizationHandler),
    ])

    try:
        sockets = tornado.netutil.bind_sockets(port, address=host)
        print("Socket binding successful to {0}:{1}".format(host, port))
    except socket.error:
        print("Socket binding failed to {0}:{1}".format(host, port))
        return

    try:
        _id = tornado.process.fork_processes(0, max_restarts=3)
        print("Process forked : {}".format(_id))

        server = tornado.httpserver.HTTPServer(application)
        server.add_sockets(sockets)
        tornado.ioloop.IOLoop.current().start()
    except KeyboardInterrupt: # stop with Ctrl+C from shell
        print("Tornado is stopping")

if __name__ == "__main__":
    print("Tornado is starting")

    main()

【问题讨论】:

    标签: python-3.x api tornado


    【解决方案1】:

    get() 方法的 args/kwargs 是从 url 中检索的(具体来说是 url 正则表达式的匹配组)。当然,您可以创建这样的东西来将参数传递给您的函数:

    (r"/geo/(.*)/(.*)", VisualizationHandler)
    

    (r"/geo/(?P<south_lat>.*)/(?P<south_long>.*)", VisualizationHandler)
    

    并且 args/kwargs south_lat 和 south_long 将从 /geo/123/456 之类的 URL 传递给您的函数,但这很不方便。我建议您将参数作为 URL 参数 /geo?south_lat=123&south_long=456 传递并使用 get_argument() 读取它们。

    【讨论】:

    • 类 VisualizationHandler(tornado.web.RequestHandler): def get(self): lat=self.get_argument('lat') long=self.get_argument('long') print("lat" + lat) print("long" + long) 我的处理程序调用就像 (r"/geo/(?P.*)/(?P.*)",VisualizationHandler)!当我像你说的那样从 URL 访问时出错!
    • 您访问的是什么网址?你遇到了什么错误?
    • 喜欢 /geo?south_lat=123&south_long=456 的方式!出现错误(404 未找到!)
    • 如果你使用/geo?south_lat=123&amp;south_long=456,你应该使用(r"/geo(.*)", VisualizationHandler)这样的设置来设置路由器。
    • 谢谢先生!我现在明白了!
    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多