2012-10-18 9 views
13

私はAjaxを介して、ロードリソースを必要とするWebアプリケーションのすべての種類の地域開発のためのPythonのSimpleHTTPServerを使用したいが、私は私のURLのクエリ文字列を使用すると、サーバは常にスラッシュで同じURLにリダイレクトSimpleHTPServerはなぜクエリー・ストリングにリダイレクトされますか?

などを呼び出します添付。

たとえば、/folder/?id=1は、HTTP 301応答を使用して/folder/?id=1/にリダイレクトします。

python -m SimpleHTTPServerを使用してサーバーを起動するだけです。

どのようにリダイレクト動作を取り除くことができますか?これはPython 2.7.2です。

+0

SimpleHTTPServerはファイルのみを扱います。要求の中のパラメータを扱うためには別のものを使用します。 –

答えて

3
照合言います

よろしいですか? Mortenの助けを借りて私はこれを思いつきました。私は必要なものすべてであると思われます。クエリ文字列を無視し、静的ファイルを提供するだけです。

import SimpleHTTPServer 
import SocketServer 

PORT = 8000 


class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 

    def __init__(self, req, client_addr, server): 
     SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, req, client_addr, server) 

    def do_GET(self): 
     # cut off a query string 
     if '?' in self.path: 
      self.path = self.path.split('?')[0] 
     SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) 


class MyTCPServer(SocketServer.ThreadingTCPServer): 
    allow_reuse_address = True 

if __name__ == '__main__': 
    httpd = MyTCPServer(('localhost', PORT), CustomHandler) 
    httpd.allow_reuse_address = True 
    print "Serving at port", PORT 
    httpd.serve_forever() 
+0

これはURLパラメータを尊重していないようです。それは依然としてクエリパラメタの後ろに '/'を追加します。 –

2

リダイレクトの生成方法がわかりません...基本的なSimpleHTTPServerを実装しようとしましたが、クエリ文字列パラメータを使用するとリダイレクトが発生しません。

self.path.split("/")のような処理を行い、要求を処理する前にパスを処理しますか? このコードは何をしたいと思うん:

import SocketServer 
import SimpleHTTPServer 
import os 


class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def folder(self): 
     fid = self.uri[-1].split("?id=")[-1].rstrip() 
     return "FOLDER ID: %s" % fid 

    def get_static_content(self): 
     # set default root to cwd 
     root = os.getcwd() 
     # look up routes and set root directory accordingly 
     for pattern, rootdir in ROUTES: 
      if path.startswith(pattern): 
       # found match! 
       path = path[len(pattern):] # consume path up to pattern len 
       root = rootdir 
       break 
     # normalize path and prepend root directory 
     path = path.split('?',1)[0] 
     path = path.split('#',1)[0] 
     path = posixpath.normpath(urllib.unquote(path)) 
     words = path.split('/') 
     words = filter(None, words) 
     path = root 
     for word in words: 
      drive, word = os.path.splitdrive(word) 
      head, word = os.path.split(word) 
      if word in (os.curdir, os.pardir): 
       continue 
      path = os.path.join(path, word) 
      return path 

    def do_GET(self): 
     path = self.path 
     self.uri = path.split("/")[1:] 

     actions = { 
      "folder": self.folder, 
     } 
     resource = self.uri[0] 
     if not resource: 
      return self.get_static_content() 
     action = actions.get(resource) 
     if action: 
      print "action from looking up '%s' is:" % resource, action 
      return self.wfile.write(action()) 
     SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) 


class MyTCPServer(SocketServer.ThreadingTCPServer): 
    allow_reuse_address = True 

httpd = MyTCPServer(('localhost', 8080), CustomHandler) 
httpd.allow_reuse_address = True 
print "serving at port", 8080 
httpd.serve_forever() 

はそれを試してみてください:

HTTP GET /folder/?id=500x - >"FOLDER ID: 500x"

をEDIT:

オーケー、あなたが使用していないので、もしSimpleHTTPServerの前に、基本的に基本リクエストハンドラを実装し、do_GET()、do_PUT()、do_POST()などを実装します。

私は通常、リクエスト文字列(reを使って)、パターンマッチを解析し、リクエストハンドラが見つかるかどうかを確認し、可能であれば静的コンテンツのリクエストとしてリクエストを処理します。

はあなたが要求がファイル・ストアに一致した場合、その後、あなたの周りのこのパターンマッチングを反転する必要があり、すべての可能な場合は、静的コンテンツを提供し、FIRST見たいといない場合は、その後、ハンドラ:)

+0

まず、ありがとう!それは、リダイレクトを防ぐことが可能であることを示しています。しかし、あたかも私が慣れていたように、このハンドラが静的ファイルを扱っていないかのようです。私が基本的に望むのは、静的ファイルとして利用可能な任意のパスを提供することで、クエリ文字列部分を完全に無視することです。 – Marian

+0

do_GET()メソッドにロジックを追加するだけで、 –

+0

というweb.pyを使用していると思われる更新を行いましたか?それは本当に軽量で、上記のコードの一部になるでしょう。 –

3

クエリパラメータは、彼らが必要として残ることを保証するためにこれを行うための正しい方法は、あなたが直接代わりにSimpleHTTPServerをさせるのファイル名への要求を行うために、あなたのindex.html

にリダイレクトを確認することです例http://localhost:8000/?param1=1は、リダイレクト(301)を実行し、URLをhttp://localhost:8000/?param=1/に変更します。これはクエリパラメータで混乱します。

ただし、http://localhost:8000/index.html?param1=1(インデックスファイルを明示的にする)が正しく読み込まれます。

だから、SimpleHTTPServerにURLリダイレクトをさせても問題は解決されません。

関連する問題