Mini Framework for Human
Project description
๐ฆ PieShark Framework
A Lightweight, Powerful Python Web Framework
๐ Overview
PieShark is a modern, lightweight WSGI-based Python web framework designed for developers who want power without complexity. Built with performance and security in mind, it offers everything you need to create robust web applications and APIs.
โจ Key Features
- ๐ฃ๏ธ Flexible Routing - Path parameters, regex patterns, and RESTful endpoints
- ๐ Built-in Security - Automatic session and cookie encryption
- ๐งฉ Modular Design - Blueprint system for organized code architecture
- โก Async/Sync Support - Native support for both synchronous and asynchronous handlers
- ๐จ Simple Templating - Lightweight template engine with Python variable injection
- ๐ง Middleware Ready - Custom middleware support for request/response processing
- ๐ฆ Static File Serving - Built-in static file handling
๐ Quick Start
Installation & Setup
from PieShark.main import pieshark, request, form, session
from PieShark.blueprint import Blueprint
from PieShark.session import SESSION
from PieShark.cookie import Cookie
from PieShark.templates import Templates
from PieShark.pydejs import PY_deJS
# Initialize your application
app = pieshark(debug=True)
# Configure your app
app.config.update({
'secret_key': 'your-super-secret-key-here',
'session_permanent': True,
'url_dbase': 'base://sqlite3:static',
'limit_size_upload': 3089003 # ~3MB upload limit
})
Your First Route
@app.route("/")
async def home():
session['user'] = 'Developer'
return Templates(
"<h1>Welcome to {{ framework }}!</h1>",
framework="PieShark"
)
@app.route("/api/user/{user_id}")
async def get_user(user_id):
return app.json_response({
"user_id": user_id,
"status": "active"
})
๐ฃ๏ธ Advanced Routing
PieShark supports multiple routing patterns to fit your application's needs:
Dynamic Parameters
@app.route("/users/{user_id}/posts/{post_id}")
async def get_user_post(user_id, post_id):
return f"User {user_id}, Post {post_id}"
HTTP Methods
@app.route("/api/data", methods=["GET", "POST", "PUT", "DELETE"])
async def handle_data():
if request.method == "POST":
# Handle POST data
return app.json_response({"created": True})
elif request.method == "GET":
# Handle GET request
return app.json_response({"data": "sample"})
๐ Security Features
Session Management
@app.route("/login", methods=["POST"])
async def login():
# Sessions are automatically encrypted
session['user_id'] = 12345
session['username'] = 'john_doe'
session['roles'] = ['user', 'admin']
return app.redirect("/dashboard")
@app.route("/dashboard")
async def dashboard():
if not session.get('user_id'):
return app.abort(401)
return f"Welcome back, {session['username']}!"
Encrypted Cookies
# Initialize cookie handler with custom salt
cookie = Cookie(salt="your_custom_salt", app=app)
@app.route("/set-preference")
async def set_preference():
# Cookies are automatically encrypted
cookie.create("theme=dark&lang=en")
return "Preferences saved!"
@app.route("/get-preference")
async def get_preference():
# Decrypt and read cookie data
theme = cookie.select.theme.decode()
return f"Current theme: {theme}"
๐งฉ Modular Architecture with Blueprints
Organize your application into logical modules:
# auth_blueprint.py
auth_bp = Blueprint('auth', url_prefix='/auth')
@auth_bp.route('/login', methods=['GET', 'POST'])
async def login():
if request.method == 'POST':
username = form.username.decode()
password = form.password.decode()
# Your authentication logic here
if authenticate(username, password):
session['user'] = username
return app.redirect('/dashboard')
return Templates("""
<form method="post">
<input name="username" type="text" placeholder="Username" required>
<input name="password" type="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
""")
@auth_bp.route('/logout')
async def logout():
session.clear()
return app.redirect('/')
# Register blueprint in main app
app.register_blueprint(auth_bp)
๐จ Template System
Inline Templates
@app.route("/profile/{username}")
async def profile(username):
user_data = get_user_data(username) # Your data fetching logic
return Templates("""
<div class="profile">
<h1>{{ user.name }}</h1>
<p>Email: {{ user.email }}</p>
<p>Joined: {{ user.join_date }}</p>
</div>
""", user=user_data)
File-based Templates
# For larger templates, use external files
@app.route("/complex-page")
async def complex_page():
return Templates("complex_template.shark",
title="My App",
data=fetch_page_data())
๐ Static File Handling
# Serve static files
app.static("static/", "/static/")
app.static("uploads/", "/files/")
# Now accessible at:
# /static/style.css -> static/style.css
# /files/document.pdf -> uploads/document.pdf
๐ค Form Processing & File Uploads
@app.route("/upload", methods=["GET", "POST"])
async def upload_file():
if request.method == "POST":
# Access form data (automatically encrypted)
title = form.title.decode()
description = form.description.decode()
# Handle file uploads
uploaded_file = form.file # File object
if uploaded_file:
filename = secure_filename(uploaded_file.filename)
///Logic your saving file
return app.json_response({
"status": "success",
"title": title,
"filename": filename
})
return Templates("""
<form method="post" enctype="multipart/form-data">
<input name="title" type="text" placeholder="Title" required>
<textarea name="description" placeholder="Description"></textarea>
<input name="file" type="file" required>
<button type="submit">Upload</button>
</form>
""")
๐ Middleware & Hooks
Request Lifecycle Hooks
@app.before_request
def authenticate_user():
"""Run before every request"""
if request.path.startswith('/admin/'):
if not session.get('is_admin'):
return app.abort(403)
@app.after_request
def add_security_headers(response):
"""Run after every request"""
response.headers['X-Content-Type-Options'] = 'nosniff'
response.headers['X-Frame-Options'] = 'DENY'
return response
Custom Middleware
class RequestTimingMiddleware:
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
start_time = time.time()
response = self.app(environ, start_response)
end_time = time.time()
print(f"Request took {end_time - start_time:.2f}s")
return response
# Apply middleware
app.wsgi_app = RequestTimingMiddleware(app.wsgi_app)
๐ API Development
RESTful API Example
api_bp = Blueprint('api', url_prefix='/api/v1')
@api_bp.route('/users', methods=['GET'])
async def list_users():
users = get_all_users() # Your data logic
return app.json_response({
"users": users,
"count": len(users)
})
@api_bp.route('/users/{user_id}', methods=['GET', 'PUT', 'DELETE'])
async def handle_user(user_id):
if request.method == 'GET':
user = get_user_by_id(user_id)
if not user:
return app.json_response({"error": "User not found"}, status=404)
return app.json_response(user)
elif request.method == 'PUT':
data = request.get_json()
updated_user = update_user(user_id, data)
return app.json_response(updated_user)
elif request.method == 'DELETE':
delete_user(user_id)
return app.json_response({"message": "User deleted"})
app.register_blueprint(api_bp)
๐ ๏ธ Utilities & Helpers
CDN Resource Fetcher (PyDeJS)
deJS = PY_deJS()
# Search for JavaScript libraries
jquery_results = deJS.get(search="jquery", limit=1)
minified_jquery = deJS.select("min")
# Use in templates
@app.route("/")
async def home():
return Templates("""
<script src="{{ jquery_url }}"></script>
<h1>jQuery Loaded!</h1>
""", jquery_url=minified_jquery)
๐ Deployment
Development Server
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
Production Deployment
Using Gunicorn
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 app:app
Using Waitress
pip install waitress
waitress-serve --host=0.0.0.0 --port=8000 app:app
Nginx Configuration Example
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static/ {
alias /path/to/your/static/files/;
expires 30d;
}
}
๐ Best Practices
Project Structure
your_project/
โ
โโโ app.py # Application entry point
โโโ config.py # Configuration settings
โโโ requirements.txt # Dependencies
โ
โโโ blueprints/ # Application modules
โ โโโ __init__.py
โ โโโ auth.py
โ โโโ api.py
โ โโโ admin.py
โ
โโโ static/ # Static assets
โ โโโ css/
โ โโโ js/
โ โโโ images/
โ
โโโ templates/ # Template files
โ โโโ base.shark
โ โโโ home.shark
โ โโโ auth/
โ โโโ login.shark
โ โโโ register.shark
โ
โโโ utils/ # Utility functions
โ โโโ __init__.py
โ โโโ auth.py
โ โโโ helpers.py
โ
โโโ tests/ # Test files
โโโ __init__.py
โโโ test_auth.py
โโโ test_api.py
Security Checklist
- โ
Use strong, unique
secret_key - โ Store sensitive config in environment variables
- โ Validate all user inputs
- โ Use HTTPS in production
- โ Implement proper error handling
- โ Set appropriate file upload limits
- โ Regular security updates
Performance Tips
- Use async handlers for I/O-bound operations
- Implement caching for frequently accessed data
- Optimize database queries
- Use CDN for static assets
- Enable gzip compression
- Monitor application performance
๐ค Contributing
PieShark is designed to be lightweight yet powerful. Whether you're building a simple API, a complex web application, or a microservice, PieShark provides the tools you need without the bloat.
Why Choose PieShark?
| Feature | PieShark | Other Frameworks |
|---|---|---|
| Learning Curve | Minimal | Steep |
| Built-in Security | โ Encrypted sessions/cookies | โ Manual setup |
| Async Support | โ Native | โ ๏ธ Plugin required |
| File Size | Lightweight | Heavy |
| Flexibility | High | Medium |
๐ Next Steps
- Start Small - Begin with a simple route and gradually add features
- Explore Blueprints - Organize your code into logical modules
- Implement Security - Leverage built-in encryption and session management
- Scale Up - Use async handlers and proper deployment strategies
- Contribute - Help make PieShark even better
Ready to dive in? Start building your next web application with PieShark today! ๐ฆโก
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file piesharkx-0.1.1.tar.gz.
File metadata
- Download URL: piesharkx-0.1.1.tar.gz
- Upload date:
- Size: 447.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a36521223748f6123f205b1688efbf5efdea2fa640d629979308b3354215ed0e
|
|
| MD5 |
ddcd1d85dc0009cf21a53107ac01e31b
|
|
| BLAKE2b-256 |
f40c8b1795c4825a8a7c3f5c1c2842d8f5ede7c54e9b0a25b4cafd4e0e36d286
|
File details
Details for the file piesharkx-0.1.1-py3-none-any.whl.
File metadata
- Download URL: piesharkx-0.1.1-py3-none-any.whl
- Upload date:
- Size: 453.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efb674934546afd5a81a5529a8d866f2cb9283de13cc5125355dfcf27208955b
|
|
| MD5 |
cd53be4dd2b25a81506893819bf56662
|
|
| BLAKE2b-256 |
7bab71b020707d231f94c73cb6b0010c9bf6b304f5f2cde2ed9b6b0ee067d1f9
|