【问题标题】:How do I correctly utilize python lists in dynamic routing for a web framework?如何在 Web 框架的动态路由中正确利用 python 列表?
【发布时间】:2014-06-03 13:18:47
【问题描述】:

我在第 9 行中遇到 key = re.findall(etc)[0] 的“列表索引超出范围错误”,我不知道为什么。我正在尝试做的是......对于路由,如果我给路由“/user//”我可以运行正则表达式 re.findall(r"", url) 这将返回列表 ['', ''] 这样我就可以放入我的路由表 {'/user' : ['name', 'page_num']}如果在浏览器中输入了 url '/user/Kyle/237',我可以看到 /user 在路由表中,它可以提供另外 2 件东西,因为在请求的 url 中的 /user 之后有 2 件东西' Kyle' 和 '237',所以在我的方法中,我会创建 2 个参数 'name' 和 'page_num',我可以看到 name 在路由中排在第一位,所以 name=Kyle 和 page_num 排在第二位,所以 page_num=237 并传递那些到我的方法,它将格式化并返回模板页面。

框架:

from wsgiref.simple_server import make_server
from wsgiref.util import setup_testing_defaults
import re

routing_table = {}

def route(url, func):
   params =  re.findall(r"<([a-zA-Z_][0-9]*)>", url)
   key = re.findall(r"(.+?)/<[a-zA-Z_][a-zA-Z0-9_]*>", url)[0]
   routing_table[key] = [params, func]

def find_path(url):
   if url in routing_table:
      return routing_table[url]
   else:
      return None

# This function is called each time the web server receives a request.
def app(environ, start_response):
   setup_testing_defaults(environ)
   handler = find_path(environ['PATH_INFO'])
   if handler is None:
      status = '404 Not Found'
      body = "<html><body><h1>Page Not Found</h1></body></html>"
   else:
      status = '200 OK'
      body = handler()  #<--- call handler
   headers = [('Content-type', 'text/html; charset=utf-8')]
   start_response(status, headers)
   return [body.encode("utf-8")]

def run(ip, port):
   myserver = make_server(ip, port, app)
   print("Serving glasses of wsgi at http://%s:%s" % (ip, port))
   myserver.serve_forever()

应用程序:

import glass

def index():
   return "This is the main page"

def hello():
   return "hi, how are you?"

def page(page_id):
   return "this is page %d" % page_id

def user(name, page_id):
    return "Hello %d! This happens to be page %d" % name, page_id

if __name__ == '__main__':
   glass.route("/", index)
   glass.route("/hello", hello)
   glass.route("/page/<page_id>", page)
   glass.route("/user/<name>/<page_id>", user)

   glass.run("127.0.0.1", 8000)

【问题讨论】:

    标签: python list dynamic frameworks routing


    【解决方案1】:

    问题在于,这个正则表达式 "(.+?)/" 只是在寻找具有这种格式的 url:

    /路线/

    如果你有这个:

    /路线

    会失败。因此,在两个第一次中, re.findall() 将返回一个空列表。然后您无法从列表中获取索引 [0]。

    你可以做的就是改变这个:

    key = re.findall(r"(.+?)/<[a-zA-Z_][a-zA-Z0-9_]*>", url)[0]
    

    为此:

    key = url
    for param in params:
        key = key.replace("/{0}".format(param),'')
    

    逻辑是:将 url (/) 中的所有参数替换为空字符串。最后,您将拥有自己的密钥(/route)。

    【讨论】:

    • 是的,但它仍然不像我需要的那样动态路由。不过,这确实修复了列表索引超出范围错误。但是,当我输入 URL:127.0.0.1:8000/user/whoever/23 时,屏幕应该通过函数动态路由参数。
    • environ['PATH_INFO'] 的值是多少?格式是什么?因为,“if url in routing_table”这一行似乎很奇怪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多