Soru Basit HTTP sunucusunda erişim kontrolünü etkinleştirin


Çok basit bir HTTP sunucusu için aşağıdaki kabuk betiğine sahibim:

#!/bin/sh

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

Nasıl etkinleştirebileceğimi veya ekleyebileceğimi merak ediyordum bir CORS başlığı sevmek Access-Control-Allow-Origin: * bu sunucuya?


76
2018-02-22 16:00


Menşei




Cevaplar:


Ne yazık ki, SimpleHTTPServer gerçekten bu kadar basittir, özellikle gönderdiği başlıklardan değil, herhangi bir kişiselleştirmeye izin vermez. Ancak, bir çoğunu kullanarak basit bir HTTP sunucusu oluşturabilirsiniz. SimpleHTTPServerRequestHandlerve sadece istenen başlığı ekleyin.

Sadece bir dosya oluştur simple-cors-http-server.py (ya da her neyse) ve aşağıdakileri içeriye koyun:

#!/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)

Sonra yapabilirsin python simple-cors-http-server.py ve her yanıt için CORS başlığını ayarlayacağınız değiştirilmiş sunucunuzu başlatır.

Üst taraftaki shebang ile dosyayı yürütülebilir hale getirin ve PATH'nize yerleştirin. simple-cors-http-server.py çok.


Python 3 ile çalışan bir çözüm için, içe aktarmak için yukarıdakileri basitçe değiştirebilirsiniz. http.server modül (tüm türleri vardır).

Alternatif olarak, hem Python 3 hem de Python 2 üzerinde çalışan bunu kullanabilirsiniz. Komut dosyası ilk olarak Python 3 konumundan içe aktarmaya çalışır ve Python 2'ye geri döner:

#!/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)

130
2018-02-22 16:28



Talimatları takip ettim ama python basit-cors-http-server.py dosyasını çalıştırarak hatayı alıyorum: python: 'simple-cors-http-server.py' dosyasını açamıyor: [Errno 2] Böyle bir dosya veya dizin çıkış yok ....Düşüncesi olan var mı? - MChan
Ardından, dosyayı doğru bir şekilde adlandırmadınız ya da geçerli dizinde değilsiniz. Hata sadece Python'un dosyayı çalıştırmayı denediğini söylüyor ancak dosyayı bulamıyor. - poke
@poke Sunucu, 501 Desteklenmeyen yöntemle ('OPTIONS') yanıt verir. OS X 10.10.1'i Python 2.7.6 ile çalıştırıyorum. Baska öneri? 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
@HairOfTheDog SimpleHTTPRequestHandler, OPTIONS HTTP yöntemini desteklemez. İsterseniz ekleyebilirsiniz (HTTP sunucuları hakkında Python kılavuzunu okuyun); ya da sunucuya böyle erişmeyi deneyemezsiniz. - poke
@RobertoFranceschini Sen koşuyor olabilirsiniz önceden kontrol edilen istekler hangi gerektirir OPTIONS Doğru uygulanacak yöntem. Basit isteklere gelince, sadece Access-Control-Allow-Origin başlık hala iyi çalışmalıdır. - poke


Http-server gibi bir alternatif deneyin

SimpleHTTPServer, gerçekten üretime dağıttığınız bir sunucu türü olmadığından, burada, dosyalarınızı açığa çıkarma işini yaptığınız sürece kullandığınız araçla ilgili çok fazla şey umursamadığınızı varsayıyorum. http://localhost:3000 Basit bir komut satırında CORS başlıklarıyla

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

#run
http-server -p 3000 --cors

Faydalı bulabileceğiniz bazı ilgili araçlar

  • ngrok: çalışırken ngrok http 3000, bir url oluşturur https://$random.ngrok.com Bu, herkesin sizin http://localhost:3000 sunucusu. Bilgisayarınızda yerel olarak neyin çalıştığıyla ilgili olarak ortaya çıkabilir (yerel arka planlar / apis dahil)

  • localtunnel: neredeyse ngrok ile aynı

  • şimdi: çalışırken now, statik varlıklarınızı çevrimiçi olarak yükler ve https://$random.now.sh. Aksine karar vermedikçe, onlar sonsuza dek çevrimiçi kalırlar. Dağıtım, (ilk olan hariç) hızlıdır. Şimdi üretim frontend / SPA kod dağıtımı için uygundur Docker ve NodeJS uygulamalarını da dağıtabilir. Gerçekten özgür değil, ama özgür bir planı var.


59
2018-02-20 15:43



bir sebepten dolayı çalışmıyor. - アレックス
tüm takımım için iyi çalışıyor. problemini açıkla lütfen - Sebastien Lorber
Bu çözüm benim için aralıklı gecikme olan pythondan çok daha iyiydi. - Tyguy7
Ben basit bir adamım. Yüklemeyi gerektiren bir çözüm görüyorum npm sadece bilinen bir makinede python, Reddediyorum. - Parthian Shot


HEAD işlemlerini desteklemeyi seçerseniz, kendi do_GET () örneklerinizi sağlamanız gerekir (ve do_HEAD ()). böyle bir şey:

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()

0
2018-02-22 16:10



Cevabınız için teşekkürler, ancak Python bilgisine sahip değilim, sadece Emberjs uygulamalarım için basit bir http sunucusu olarak yukarıda bahsedilen kabuk betiğini kullanıyorum. Sadece erişim kontrol sorunu ile çarpıştığında, bu basit http sunucusunda bunu etkinleştirmem gerektiğini bulmaya çalıştım. Bu yüzden bazı araştırmalardan sonra ekledim ('CrossOrigin'i etkinleştir, origins =>' * ';) ama şaşırtıcı bir şekilde işe yaramadı. Eğer beni çok takdir edecek olan erişim kontrol özelliği içeren herhangi bir Python basit http sunucu kabuk betiğine yönlendirebilirsiniz. - MChan
Küçük bir notta, burada tembel olmaya çalışmıyorum ama python öğrenmeye başladım sadece bu özelliği eklemek için basitHTTP sunucusuna mantıklı gelmiyor bu yüzden mantıklı gelmeyecek diye umuyordum. İşimi yapabileceğim bir alternatif / hazır Python betiği - MChan
SimpleHTTPServer'ın erişim denetimlerini destekleyecek bir seçeneği yoktur. Ya kendi kodunuzu açmanız gerekecek - ya da erişim kontrollerini destekleyen başka bir web sunucusuna geçmelisiniz. Hakkında düşün lighttpd.net - user590028