A really basic, not so safe web server.
Project description
SMDB Web Server
An easy to use, not secured web server, because I don't like the other options, and I like to create my own solutions most of the time.
Table of content
Section Name |
---|
Usage |
Get handler |
Put Handler |
Data |
Usage
To start using this HTTP Server, import the HTMLServer
class, and initialize it.
from smdb_web_server import HTMLServer, UrlData
server = HTMLServer("127.0.0.1", 8080, title="Example server")
An smdb_logger
can be used, if desired, but not neccesery.
To add a new url path, use the add_url_rule
command.
def index_handler(url_data: UrlData) -> str:
...
server.add_url_rule("/", index_handler)
This method will be called with a GET
request by default. This can be set as an optional parameter called protocol
. For now, only GET
and PUT
are supported.
Url handlers can be assigned with a decorator as well:
@server.as_url_rule("/help")
def help_handler(url_data: UrlData) -> str:
...
To start the server, use either the serve_forever
or the serve_forever_threaded
function. The first will be a blocking call, the second will create a new thread.
server.serve_forever_threaded(template_dictionary, static_dictionary, "Example Thread")
Both handlers can fail with KnownError exception, whitch will result in a user controlled return code and reason.
GET handler
This handler can return any string, but it's usefull, if it returns an HTML file as string. This can be a hardcoded HTML code, or a static or dynamic file. For rendering HTML template files, the server has a helper function called render_template_file
. This can render an HTML file from a pre setup dictionary.
def index_handler(url_data: UrlData) -> str:
example_list = ["value1", "value2|False", "value3|True"]
return server.render_template("index", page_title="Example Title", example_selector=example_list, button_1="Button 1 name", button_2="Button 2 name")
If you need to just create a list to update an already rendered HTML page's selector, you can use it the following way:
def update(url_data: UrlData):
return server.render_template_list("example_selector", ["value1|True", "value2|False", "value3|False"])
server.add_url_rule("/update", update)
This will result in the following list, if we use the option
tag as shown in the template_dictionary in the data paragraph:
<option disabled></option>
<option value="value1" selected>value1</option>
<option value="value2">value2</option>
<option value="value3">value3</option>
This list will be sent as a plaintext
response.
Put Handler
This handler can return a simple string. The incoming data will be a bytearray of the body of the request.
from smdb_web_server import Protocol
def put_handler(url_data: UrlData) -> str:
# Do stuff here.
# Either return with string, or fail with KnownError
...
server.add_url_rule("/put", put_handler, Protocol.Put)
Data
Template dictionary
- Keys: The "file name" without extention
- Value: The file's content, or a path in the following format: "PATH|{Relative path to file}"
This dictionary will be used to generate HTML response from the template. Theese templates can have replaceable values with the following format.
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ page_title }}</title>
<link rel="stylesheet" href="/static/style.css">
</head>
<body>
<div class="container">
<h2>Example Header</h2>
<div class="grid-container">
<label for="ExampleSelector">Example Selector:</label>
<select id="ExampleSelector" class="fixed-width">
{{[ example_selector ]}}
</select>
<div class="button-group">
<button id="ExampleButton1">{{ button_1 }}</button>
<button id="ExampleButton2">{{ button_2 }}</button>
</div>
</div>
</div>
<script src="/static/script.js"></script>
</body>
</html>
In this page the {{ page_title }}
, the {{ button_1 }}
and the {{ button_2 }}
will be replaced with one value, and the {{[ ExampleSelector ]}}
will be generated using a list.
This dictionary should contain a key-value pair with the value being a repeateable value to fill the {{[ ExampleSelector ]}}
place.
selector_values = """<option value="{{VALUE}}"{{SELECTED}}>{{VALUE}}</option>"""
Here, the {{VALUE}}
will be replaced by the list's content, and the {{SELECTED}}
will be replaced by either the value selected
or with an emty string, if the list's value is formatted in the following manner: {value}|True
. If the value following the |
character is not "True", it will be treated as if it was not present.
You can return a list by calling the render_template_list
function by itself, or by rendering a full HTML page by calling render_template
, with a list as an argument.
Static dictionary
- Keys: The "file name" without extention
- Value: Either the file's content, or a path in the following format: "PATH|{Relative path to file}"
Static files will be sent automatically, if the correct URL is called. In the Template Dictionary example, the javascript and the css files are loaded from the path /static/{file_name}
. This will result in the {file_name}
file being served from the dictionary.
KnownError
This error is used to send a usercontrolled response code to the requester. This exception can be used the following way:
from smdb_web_server import KnownError
def fail(_):
raise KnownError("Reason", 405)
Protocol
This is a simple enum class to use with add_url_rule
to determine the protocol to be used
Values: Get
, Put
UrlData
This dataclass contains the following fields, either filled or containing None
:
- fragment:
String
object (Data following the#
in the URL) - query:
Dictionary
with string keys and values (Data following the?
in the URL). The key will be the part following the?
or&
characters, and the value will be the part after the=
sign. If there is no value,None
will be used as a value in the dictionary. - data:
Bytes
object (Payload of the request, if available)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file smdb_web_server-0.3.3.tar.gz
.
File metadata
- Download URL: smdb_web_server-0.3.3.tar.gz
- Upload date:
- Size: 8.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 18046630da134d354c90fd47e9b876e303ffc589d4fadda10d44d7ab56db8c5c |
|
MD5 | a7bfd04e8134b1aedc54af8ce8315122 |
|
BLAKE2b-256 | 218602fe6dc41544276027b02b238974c3de096dec43b74ffa3f6d9d8d1bf58a |
File details
Details for the file smdb_web_server-0.3.3-py3-none-any.whl
.
File metadata
- Download URL: smdb_web_server-0.3.3-py3-none-any.whl
- Upload date:
- Size: 8.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | aff45a327a6ddc7382da26d0bdff37bbc1182617bd36af13aeb4d24ed8cc0941 |
|
MD5 | 08c93d4a6feb289ec0e5a8525756cb75 |
|
BLAKE2b-256 | 403fae2b293519058d787467f0a9dd9e25f7d4ba629fb2890cc1098d45e17f26 |