सरल HTTP सर्वर पर अभिगम नियंत्रण सक्षम करें


121

मेरे पास बहुत ही सरल HTTP सर्वर के लिए निम्नलिखित शेल स्क्रिप्ट है:

#!/bin/sh

echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000

मैं सोच रहा था कि मैं इस सर्वर की तरह एक CORS शीर्षलेख को कैसे सक्षम या जोड़ सकता हूं Access-Control-Allow-Origin: *?

जवाबों:


197

दुर्भाग्य से, सरल HTTP सर्वर वास्तव में इतना सरल है कि यह किसी भी अनुकूलन की अनुमति नहीं देता है, विशेष रूप से हेडर के लिए नहीं जो इसे भेजता है। आप हालांकि, अधिकांश का उपयोग करके अपने आप को एक सरल HTTP सर्वर बना सकते हैं SimpleHTTPRequestHandler, और बस उस इच्छित शीर्ष लेख को जोड़ सकते हैं।

उसके लिए, बस एक फ़ाइल simple-cors-http-server.py(या जो कुछ भी) बनाएं और, आपके द्वारा उपयोग किए जा रहे पायथन संस्करण के आधार पर, निम्न में से एक कोड को अंदर रखें।

तब आप कर सकते हैं python simple-cors-http-server.pyऔर यह आपके संशोधित सर्वर को लॉन्च करेगा जो हर प्रतिक्रिया के लिए कॉर्स हेडर सेट करेगा।

शीर्ष पर Shebang के साथ , फ़ाइल को निष्पादन योग्य बनाएं और इसे अपने PATH में डालें, और आप इसे केवल उपयोग करके simple-cors-http-server.pyभी चला सकते हैं।

अजगर 3 समाधान

अजगर 3 का उपयोग करता है SimpleHTTPRequestHandlerऔर HTTPServerसे http.serverमॉड्यूल सर्वर को चलाने के लिए:

#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test
import sys

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)

अजगर 2 समाधान

पायथन 2 का उपयोग करता है SimpleHTTPServer.SimpleHTTPRequestHandlerऔर सर्वर को चलाने के लिए BaseHTTPServerमॉड्यूल

#!/usr/bin/env python2
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)

पायथन 2 और 3 समाधान

यदि आपको Python 3 और Python 2 दोनों के लिए संगतता की आवश्यकता है, तो आप इस पॉलीग्लॉट स्क्रिप्ट का उपयोग कर सकते हैं जो दोनों संस्करणों में काम करती है। यह पहले पायथन 3 स्थानों से आयात करने की कोशिश करता है, और अन्यथा अजगर 2 पर वापस आ जाता है:

#!/usr/bin/env python
try:
    # Python 3
    from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig
    import sys
    def test (*args):
        test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
except ImportError: # Python 2
    from BaseHTTPServer import HTTPServer, test
    from SimpleHTTPServer import SimpleHTTPRequestHandler

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer)

मैंने निर्देशों का पालन किया, लेकिन अजगर को सरल करने से- cors-http-server.py मुझे त्रुटि मिली: अजगर: फ़ाइल को 'simple-cors-http-server.py' नहीं खोल सकते: [Errno 2] ऐसी कोई फ़ाइल या निर्देशिका लॉगआउट नहीं है ....कोई विचार?
एमसीएन

4
@ सर्वर 501 असमर्थित विधि ('विकल्प') के साथ प्रतिक्रिया करता है। मैं पायथन 2.7.6 के साथ OS X 10.10.1 चला रहा हूं। कोई सुझाव? HTTP/1.0 501 Unsupported method ('OPTIONS') Server: SimpleHTTP/0.6 Python/2.7.6 Date: Wed, 21 Jan 2015 23:16:10 GMT Content-Type: text/html Connection: close Access-Control-Allow-Origin: *
HairOfTheDog

1
@HairOfTheDog SimpleHTTPRequestHandler विकल्प HTTP विधि का समर्थन नहीं करता है। आप चाहें तो इसे जोड़ सकते हैं (HTTP सर्वर के बारे में पायथन मैनुअल पढ़ें); या आप इस तरह से सर्वर तक पहुँचने की कोशिश नहीं कर सकते।
प्रहार

2
@RobertoFranceschini आप पूर्वनिर्धारित अनुरोधों में चल रहे हो सकते हैं जिन्हें OPTIONSठीक से लागू करने के लिए विधि की आवश्यकता होती है। साधारण अनुरोधों के अनुसार, सिर्फ Access-Control-Allow-Originहेडर भेजने का समाधान अभी भी ठीक काम करना चाहिए।
प्रहार

1
@ Tyguy7 हालांकि साधारण HTTP सर्वर के साथ एक सामान्य व्यवहार हो सकता है। मेरे पास प्रदर्शन से पहले अलग-अलग परिणाम थे। लेकिन बस एक पल के लिए सर्वर चलाने के लिए, मैं अभी भी इसे सबसे तेज समाधान मानता हूं।
प्रहार

108

Http-server जैसे विकल्प का प्रयास करें

जैसा कि SimpleHTTPServer वास्तव में उस तरह का सर्वर नहीं है जिसे आप उत्पादन के लिए तैनात करते हैं, मैं यहां यह मान रहा हूं कि आप इस बात की परवाह नहीं करते हैं कि आप किस टूल का उपयोग तब तक करते हैं जब तक कि यह आपकी फ़ाइलों को http://localhost:3000एक साधारण में कोरस हेडर के साथ उजागर करने का काम नहीं करता है। कमांड लाइन

# install (it requires nodejs/npm)
npm install http-server -g

#run
http-server -p 3000 --cors

HTTPS की आवश्यकता है?

अगर आपको स्थानीय में https चाहिए तो आप कैडी या सर्टिफिकेट भी आजमा सकते हैं


कुछ संबंधित उपकरण जो आपको उपयोगी लग सकते हैं

  • ngrok : दौड़ते समय ngrok http 3000, यह एक url बनाता है जो https://$random.ngrok.comकिसी को भी आपके http://localhost:3000सर्वर तक पहुंचने की अनुमति देता है । यह दुनिया के लिए आपके कंप्यूटर पर स्थानीय रूप से चलने वाले (स्थानीय बैकएंड / एपिस सहित) को उजागर कर सकता है

  • localtunnel : लगभग ngrok के समान है

  • अब : जब चल रहा है now, यह आपकी स्थैतिक संपत्ति को ऑनलाइन अपलोड करता है और उन्हें तैनात करता है https://$random.now.sh। जब तक आप अन्यथा निर्णय नहीं लेते, वे हमेशा के लिए ऑनलाइन रहते हैं। तैनाती तेजी से (पहले एक को छोड़कर) अलग करने के लिए धन्यवाद। अब प्रोडक्शन फ्रंट / एसपीए कोड परिनियोजन के लिए उपयुक्त है। यह डॉकर और नोडज ऐप्स को भी तैनात कर सकता है। यह वास्तव में मुफ्त नहीं है, लेकिन उनके पास एक मुफ्त योजना है।


5
मैं एक साधारण आदमी हूं। मुझे एक समाधान दिखाई देता है जिसे npmमशीन पर स्थापित करने की आवश्यकता होती है जो केवल ज्ञात है python, मैं डाउनवोट करता हूं।
पार्थियन ने

6
@ParthianShot: आप नौकरी के लिए सर्वोत्तम टूल का उपयोग करना सीखना चाहते हैं।
डेन डैस्कलेस्कु

2
@ParthianShot कई डेवलपर्स के पास पहले से ही नोड / npm स्थापित है। और सवाल का शीर्षक उपयोगकर्ताओं के बड़े दर्शकों को ड्राइव करने के लिए पर्याप्त सामान्य है जो स्पष्ट रूप से अजगर या सिम्पल टीटीपीएसवर के बारे में परवाह नहीं करते हैं, जो कि अपवोट्स द्वारा पुष्टि की जाती है। ऐसा नहीं है क्योंकि यह आपके लिए उपयोगी नहीं है कि यह हर किसी के लिए है। नोड और पायथन दोनों को पसंद नहीं करने के अच्छे कारण हैं। लेफ्टपैड / खराब प्रकाशित / खराब गिट उपयोग जैसी चीजें मुझे पूरी तरह से असंबंधित लगती हैं।
सेबस्टियन लॉर्बर

5
एक अतिरिक्त भाषा और रूपरेखा जोड़ने से तकनीकी ऋण बढ़ता है और एक पर्यावरण की हमले की सतह बढ़ जाती है। "किसी भी प्रोग्रामिंग भाषा में घातक गलतियाँ की जा सकती हैं" यह सच है, लेकिन जेएस अन्य भाषाओं की तुलना में उस तरह से आसान बनाता है। और हर भाषा में गच्चा है; आप जितनी कम भाषाओं का उपयोग करते हैं, उतनी ही कम संभावना है कि कुछ डेवलपर जो किसी एक भाषा से अपरिचित हैं, एक ऐसी गलती करते हैं जो किसी अन्य भाषा में गलती नहीं होगी।
पार्थियन शॉट 0

2
यह हर बार एक बच्चे को गोद लेने जैसा है जिसे आपको घर के आसपास मदद की ज़रूरत होती है; यह सड़क को हल करने की तुलना में अधिक समस्याएं पैदा करता है।
पार्थियन ने

1

मैं एक ही समस्या थी और इस समाधान के लिए आया था:

class Handler(SimpleHTTPRequestHandler):
    def send_response(self, *args, **kwargs):
        SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
        self.send_header('Access-Control-Allow-Origin', '*')

मैंने केवल SimpleHTTPRequestHandler से विरासत में एक नया वर्ग बनाया है जो केवल send_responseविधि को बदलता है ।


0

यदि आपको HEAD ऑपरेशंस का समर्थन करना है, तो आपको do_GET () और (do_HEAD) का अपना उदाहरण प्रदान करना होगा। कुछ इस तरह:

class MyHTTPServer(SimpleHTTPServer):

    allowed_hosts = (('127.0.0.1', 80),)

    def do_GET(self):
        if self.client_address not in allowed_hosts:
            self.send_response(401, 'request not allowed')
        else:
            super(MyHTTPServer, self).do_Get()

आपके उत्तर के लिए धन्यवाद, लेकिन मेरे पास कोई पायथन ज्ञान नहीं है, इसलिए कभी भी, मैं सिर्फ ऊपर उल्लिखित शेल स्क्रिप्ट का उपयोग कर रहा हूं जो मेरे एम्बरज एप्लिकेशन के लिए एक सरल http सर्वर के रूप में है। केवल जब अभिगम नियंत्रण की समस्या से टकराया, मैंने यह खोजने के लिए शोध किया कि मुझे इस सरल http सर्वर में इसे सक्षम करने की आवश्यकता है। इसलिए कुछ शोधों के बाद मैंने जोड़ा ('क्रॉसऑरिजिन सक्षम करें', उत्पत्ति => '*';) लेकिन आश्चर्यजनक रूप से यह काम नहीं किया। यदि आप मुझे किसी भी पाइथन सरल http सर्वर शेल स्क्रिप्ट की ओर संकेत कर सकते हैं, जिसमें एक्सेस कंट्रोल फीचर शामिल है, जिसे बहुत सराहा जाएगा
MChan

एक छोटे नोट पर, मैं वास्तव में यहाँ आलसी होने की कोशिश नहीं कर रहा हूँ, लेकिन सिंप्लिप्ट सर्वर पर इस सुविधा को जोड़ने के लिए सिर्फ अजगर सीखना शुरू करें, इस बिंदु पर तार्किक नहीं लगता है इसलिए मैं उम्मीद कर रहा था कि इसे जोड़ना आसान होगा या उम्मीद है कि मुझे मिल सकता है एक विकल्प / तैयार Python स्क्रिप्ट है जो काम कर सकते हैं, ताकि मैं अपने देव काम के साथ जारी रख सकते हैं
MChan

3
SimpleHTTPServer के पास अभिगम नियंत्रण का समर्थन करने के लिए कोई विकल्प नहीं है। या तो आपको अपना कोड रोल करना होगा - या एक्सेस कंट्रोल का समर्थन करने वाले किसी अन्य वेब सर्वर पर स्विच करना होगा। के बारे में सोचो lighttpd.net
user590028
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.