[英]Python SimpleXMLRPCServer: get user IP and simple authentication
我正在嘗試使用Python制作一個非常簡單的XML RPC服務器,該服務器提供基本的身份驗證以及獲取連接的用戶IP的能力。 讓我們來看一下http://docs.python.org/library/xmlrpclib.html中提供的示例:
import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer
def is_even(n):
return n%2 == 0
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(is_even, "is_even")
server.serve_forever()
因此,現在,這背后的第一個想法是讓用戶提供憑據並對其進行處理,然后再允許其使用功能。 我需要非常簡單的身份驗證,例如僅一個代碼。 現在,我正在執行的是強制用戶在函數調用中提供此代碼,並使用if語句對其進行測試。
第二個是當用戶調用函數時能夠獲得用戶IP或在連接服務器后將其存儲。
此外,我已經在運行Apache Server,將其集成到其中可能會更簡單。
你怎么看?
這是一個相關的問題,我發現有幫助:
Python SimpleXMLRPCServer中客戶端的IP地址?
對我而言,有效的方法是在服務器的覆蓋的finish_request方法中獲取client_address,將其存儲在服務器本身中,然后在覆蓋的服務器_dispatch例程中對其進行訪問。 您也許也可以從該方法內部訪問服務器本身,但是我只是試圖將IP地址作為自動第一個參數添加到我的所有方法調用中。 我使用dict的原因是因為我還將添加會話令牌以及其他元數據。
from xmlrpc.server import DocXMLRPCServer
from socketserver import BaseServer
class NewXMLRPCServer( DocXMLRPCServer):
def finish_request( self, request, client_address):
self.client_address = client_address
BaseServer.finish_request( self, request, client_address)
def _dispatch( self, method, params):
metadata = { 'client_address' : self.client_address[ 0] }
newParams = ( metadata, ) + params
return DocXMLRPCServer._dispatch( self, method, metadata)
請注意,這會破壞諸如system.listMethods()之類的自省功能,因為這不需要額外的參數。 一種想法是檢查“系統”的方法名稱。 並在這種情況下通過常規參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.