Apakah mungkin menjalankan SimpleHTTPServer python di localhost saja?

88

Saya memiliki koneksi vpn dan ketika saya menjalankan python -m SimpleHTTPServer, ini berfungsi di 0.0.0.0:8000, yang berarti dapat diakses melalui localhost dan melalui ip asli saya. Saya tidak ingin robot memindai saya dan tertarik bahwa server hanya akan diakses melalui localhost.

Apa itu mungkin?

python -m SimpleHTTPServer 127.0.0.1:8000  # doesn't work.

Server http sederhana lainnya yang dapat dijalankan secara instan menggunakan baris perintah juga diterima.

pengguna1639431
sumber
4
Anda cukup memblokir koneksi luar pada port itu dari firewall / router Anda.
Burhan Khalid
8
Sementara pertanyaan yang bagus untuk python2, dapat dicatat di sini bahwa di python3 penggantian http.servermemungkinkan pengikatan segera, misalnya python3 -m http.server --bind 127.0.0.1 8000akan cukup
kemanusiaan dan
1
Sidenote : SimpleHTTPServeradalah single-threading dan blocking, artinya Anda tidak akan dapat melakukan permintaan lain sampai permintaan sebelumnya selesai. Dan itu tidak memiliki dukungan jangkauan misalnya untuk streaming / mencari file media dari posisi tertentu. Alternatif yang lebih baik adalah twisted( pip install twisted) yang dapat Anda jalankan twistd -n web --path /. Itu juga dapat melakukan FTP anonim dengan twistd -n ftp -p 2121 -r /. Lebih banyak server http satu baris: gist.github.com/willurd/5720255 .
ccpizza

Jawaban:

54

Jika Anda membaca sumbernya, Anda akan melihat bahwa hanya port yang dapat diganti pada baris perintah. Jika Anda ingin mengubah host tempat ia dilayani, Anda perlu menerapkan test()metode the SimpleHTTPServerand BaseHTTPServeryourself. Tapi itu seharusnya sangat mudah.

Inilah cara Anda melakukannya, dengan sangat mudah:

import sys
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer


def test(HandlerClass=SimpleHTTPRequestHandler,
         ServerClass=BaseHTTPServer.HTTPServer):

    protocol = "HTTP/1.0"
    host = ''
    port = 8000
    if len(sys.argv) > 1:
        arg = sys.argv[1]
        if ':' in arg:
            host, port = arg.split(':')
            port = int(port)
        else:
            try:
                port = int(sys.argv[1])
            except:
                host = sys.argv[1]

    server_address = (host, port)

    HandlerClass.protocol_version = protocol
    httpd = ServerClass(server_address, HandlerClass)

    sa = httpd.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever()


if __name__ == "__main__":
    test()

Dan untuk menggunakannya:

> python server.py 127.0.0.1     
Serving HTTP on 127.0.0.1 port 8000 ...

> python server.py 127.0.0.1:9000
Serving HTTP on 127.0.0.1 port 9000 ...

> python server.py 8080          
Serving HTTP on 0.0.0.0 port 8080 ...
sberry
sumber
97

Di Python versi 3.4 dan yang lebih tinggi, http.servermodul menerima bindparameter.

Menurut dokumen :

python -m http.server 8000

Secara default, server mengikat dirinya sendiri ke semua antarmuka. Opsi -b / - bind menentukan alamat spesifik yang harus diikat. Misalnya, perintah berikut menyebabkan server mengikat ke localhost saja:

python -m http.server 8000 --bind 127.0.0.1

Baru di versi 3.4: argumen --bind diperkenalkan.

Jet Blue
sumber
75

Seperti yang dijelaskan @sberry , hanya melakukannya dengan menggunakan python -m ...metode yang bagus tidak akan mungkin, karena alamat IP di-hardcode dalam implementasi BaseHttpServer.testfungsi.

Cara melakukannya dari baris perintah tanpa menulis kode ke file terlebih dahulu adalah

python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("127.0.0.1", 8888), shs.SimpleHTTPRequestHandler).serve_forever()'

Jika itu masih dihitung sebagai satu liner tergantung pada lebar terminal Anda ;-) Ini tentu tidak mudah diingat.

Lukas Graf
sumber
4
Menambahkan ini ke .bash_profile. Nyam. Sekarang saya bisa mengetik H. Terima kasih! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Cory Mawhorter
4
Agar pekerjaan ini sebagai server http sederhana di windows 10 menggunakan Python 3.5.1, saya harus mengubahnya sebagai berikut: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" Perhatikan perubahan kutipan dan fakta bahwa Server HTTP Base dan Sederhana sekarang ada di http.server.
Alexander Varwijk
+1 tentang penggunaan alias profil, saya menyebut milik saya 'servelocal' - ada sedikit tarian yang berubah dan menghilangkan tanda kutip untuk membuat sintaks bash bahagia, tetapi hasilnya bagus.
sdupton
Sangat membantu ... :)
user3145373 ツ