mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
Remove develop_server.sh in favour of pelican serving static files itself
Competing static site generators integrate the functionality of regenerating content and serving it into their main executable. In pelican this functionality used to be in an external script `develop_server.sh` which resides in the blog base directory. This has the disadvantage that changes in pelican can break the `develop_server.sh` scripts which will not automatically be upgraded together with pelican by package managers. Thus, pelican should integrate this functionality into its main executable. To this end, this commit removes `develop_server.sh` and adds three command line options to the pelican executable: * `-l/--listen` starts the HTTP server (`-s/--serve` was already taken) * `-p/--port` specifies the port to listen at * `-b/--bind` specifies the IP to bind to `--listen` and `--autoreload` can be used together to achieve the same effect that other static site generators offer: Serve files via HTTP while at the same time auto-generating the content. Since the `develop_server.sh` script was removed, pelican-quickstart looses the `develop` option. Since the `develop_server.sh` script was removed, the Makefile looses the `stopserver` target and the `devserver` target is replaced by running `pelican -l` in the foreground. Since pelican now offers the `--listen` option, the fabfile uses that instead of starting the socketserver itself.
This commit is contained in:
parent
ee24ad1821
commit
a5edbf8546
11 changed files with 199 additions and 237 deletions
|
|
@ -4,6 +4,7 @@ from __future__ import print_function, unicode_literals
|
|||
import argparse
|
||||
import logging
|
||||
import os
|
||||
import posixpath
|
||||
import ssl
|
||||
import sys
|
||||
|
||||
|
|
@ -12,8 +13,9 @@ try:
|
|||
except ImportError:
|
||||
magic_from_file = None
|
||||
|
||||
from six.moves import BaseHTTPServer
|
||||
from six.moves import SimpleHTTPServer as srvmod
|
||||
from six.moves import socketserver
|
||||
from six.moves import urllib
|
||||
|
||||
|
||||
def parse_arguments():
|
||||
|
|
@ -33,6 +35,9 @@ def parse_arguments():
|
|||
parser.add_argument('--key', default="./key.pem", nargs="?",
|
||||
help='Path to certificate key file. ' +
|
||||
'Relative to current directory')
|
||||
parser.add_argument('path', default=".",
|
||||
help='Path to pelican source directory to serve. ' +
|
||||
'Relative to current directory')
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
|
|
@ -40,6 +45,26 @@ class ComplexHTTPRequestHandler(srvmod.SimpleHTTPRequestHandler):
|
|||
SUFFIXES = ['', '.html', '/index.html']
|
||||
RSTRIP_PATTERNS = ['', '/']
|
||||
|
||||
def translate_path(self, path):
|
||||
# abandon query parameters
|
||||
path = path.split('?', 1)[0]
|
||||
path = path.split('#', 1)[0]
|
||||
# Don't forget explicit trailing slash when normalizing. Issue17324
|
||||
trailing_slash = path.rstrip().endswith('/')
|
||||
path = urllib.parse.unquote(path)
|
||||
path = posixpath.normpath(path)
|
||||
words = path.split('/')
|
||||
words = filter(None, words)
|
||||
path = self.base_path
|
||||
for word in words:
|
||||
if os.path.dirname(word) or word in (os.curdir, os.pardir):
|
||||
# Ignore components that are not a simple file/directory name
|
||||
continue
|
||||
path = os.path.join(path, word)
|
||||
if trailing_slash:
|
||||
path += '/'
|
||||
return path
|
||||
|
||||
def do_GET(self):
|
||||
# cut off a query string
|
||||
if '?' in self.path:
|
||||
|
|
@ -83,11 +108,17 @@ class ComplexHTTPRequestHandler(srvmod.SimpleHTTPRequestHandler):
|
|||
return mimetype
|
||||
|
||||
|
||||
class RootedHTTPServer(BaseHTTPServer.HTTPServer):
|
||||
def __init__(self, base_path, *args, **kwargs):
|
||||
BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
|
||||
self.RequestHandlerClass.base_path = base_path
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = parse_arguments()
|
||||
socketserver.TCPServer.allow_reuse_address = True
|
||||
RootedHTTPServer.allow_reuse_address = True
|
||||
try:
|
||||
httpd = socketserver.TCPServer(
|
||||
httpd = RootedHTTPServer(
|
||||
(args.server, args.port),
|
||||
ComplexHTTPRequestHandler)
|
||||
if args.ssl:
|
||||
|
|
@ -97,7 +128,6 @@ if __name__ == '__main__':
|
|||
except ssl.SSLError as e:
|
||||
logging.error("Couldn't open certificate file %s or key file %s",
|
||||
args.cert, args.key)
|
||||
except OSError as e:
|
||||
logging.error("Could not listen on port %s, server %s.",
|
||||
args.port, args.server)
|
||||
sys.exit(getattr(e, 'exitcode', 1))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue