Drop-in blog integration for Django & Flask — powered by EarlySEO. Articles are served from EarlySEO's CDN. Just add your site ID and go.
Project description
earlyseo-blog
Drop-in blog integration for Django and Flask — powered by EarlySEO. Articles are authored in the EarlySEO dashboard and served from a global CDN. This package fetches and renders them in your Python web app.
Quick Start (Recommended)
The fastest way to get started — run the CLI from your project root:
pip install earlyseo-blog
earlyseo-blog
The CLI automatically:
- Detects whether you're using Django or Flask
- Asks for your Site ID (from Dashboard → Integrations → SDK)
- Generates starter templates, URL config, and a
.envfile
Run your dev server and visit /blog — your articles are live.
Manual Setup
If you prefer to configure things yourself:
Django
pip install "earlyseo-blog[django]"
settings.py
INSTALLED_APPS = [
# …
"earlyseo_blog.django",
]
EARLYSEO_SITE_ID = "your-site-id" # from Dashboard → Integrations → SDK
urls.py
from django.urls import include, path
urlpatterns = [
path("blog/", include("earlyseo_blog.django.urls")),
]
Visit /blog to see your articles.
Template tags
Override the built-in HTML by creating your own templates:
<!-- templates/earlyseo/blog_list.html -->
{% extends "base.html" %}
{% load earlyseo %}
{% block extra_head %}{% earlyseo_styles %}{% endblock %}
{% block content %}
{% for article in articles %}
<h2><a href="{% url 'earlyseo_blog:blog_detail' slug=article.slug %}">{{ article.title }}</a></h2>
<p>{{ article.meta_description }}</p>
{% endfor %}
{% endblock %}
Available template tags: {% earlyseo_styles %}, {% earlyseo_article_css %}, {% earlyseo_article article %}.
Flask
pip install "earlyseo-blog[flask]"
app.py
from flask import Flask
from earlyseo_blog.flask.views import create_blog_blueprint
app = Flask(__name__)
app.config["EARLYSEO_SITE_ID"] = "your-site-id"
app.register_blueprint(create_blog_blueprint(), url_prefix="/blog")
Override the built-in HTML by placing templates/earlyseo/blog_list.html and templates/earlyseo/blog_detail.html in your templates folder.
Python Client
Use the client directly in any Python app:
from earlyseo_blog import EarlySeoClient
client = EarlySeoClient(site_id="your-site-id")
# List articles (page 1)
page = client.get_list_page(1)
for article in page.articles:
print(article.title, article.slug)
# Get a single article
article = client.get_article("my-article-slug")
print(article.title)
print(article.content_html)
Async Client
from earlyseo_blog import AsyncEarlySeoClient
async def main():
async with AsyncEarlySeoClient(site_id="your-site-id") as client:
page = await client.get_list_page(1)
article = await client.get_article("my-article-slug")
Install the async extra for HTTP/2 support:
pip install "earlyseo-blog[async]"
Models
All responses are validated with Pydantic v2:
| Model | Description |
|---|---|
Manifest |
Site manifest with total pages/articles |
ArticleListItem |
Summary for list views |
ArticleListPage |
Paginated list of ArticleListItem |
Article |
Full article with content_html |
from earlyseo_blog.models import Article, Manifest
CSS
Built-in styles for article content and blog layout:
from earlyseo_blog.css import ARTICLE_CSS, BLOG_CSS
Include them in your <style> tag or template to get default styling.
Configuration
| Setting | Description | Default |
|---|---|---|
site_id |
Your EarlySEO site ID (required) | — |
cdn_base_url |
CDN base URL | https://media.earlyseo.com |
Django: Set EARLYSEO_SITE_ID and optionally EARLYSEO_CDN_BASE_URL in settings.py.
Flask: Set in app.config["EARLYSEO_SITE_ID"] and optionally app.config["EARLYSEO_CDN_BASE_URL"].
Requirements
- Python ≥ 3.9
- httpx ≥ 0.24
- pydantic ≥ 2.0
- Django ≥ 4.2 (for Django integration)
- Flask ≥ 2.3 (for Flask integration)
License
Proprietary — see LICENSE for details.
Project details
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 earlyseo_blog-1.0.1.tar.gz.
File metadata
- Download URL: earlyseo_blog-1.0.1.tar.gz
- Upload date:
- Size: 14.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e55d27e5348ceccb763abfe58da4cd70ef5bc29c9d5f729e153482c89a5c6d1
|
|
| MD5 |
777ad526a176337b760ef5d8f04602c0
|
|
| BLAKE2b-256 |
a59c0e5e56f3f7cccb7ea711441c67cbbab4b5a08ebfafd4cb75c26ba2408b24
|
File details
Details for the file earlyseo_blog-1.0.1-py3-none-any.whl.
File metadata
- Download URL: earlyseo_blog-1.0.1-py3-none-any.whl
- Upload date:
- Size: 18.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aac399bda93c03b39ef1f88d962ff4b1a9579aacfc19d039a627ab7ad2b63183
|
|
| MD5 |
533037a8c7b284e2e2cef98c39c2b7bb
|
|
| BLAKE2b-256 |
0419377a64e4b99a997cdcb7a2d640a95a71b6f81750c8ed167c0a1c7272567f
|