Python Logo

Python Blog Engine

You've got better things to do than build another blog

Add Butter to your Python app and get back to more interesting problems

Try ButterCMS free

ButterCMS is an API-based python blog engine that integrates with Python apps in minutes. Use ButterCMS with Flask, Django, or other Python apps to quickly add a blog to your app. Butter is great for blogs and dynamic pages.

Above is quick video of integrating Butter's blog engine into an application.

Butter's Blog API slides right into our apps and helps avoid having yet another WordPress site.

Daniel, Founder of Collective Idea

All your requirements, solved

  • ButterCMS Feature Image Use main domain (for SEO)
  • ButterCMS Feature Image Friendly admin interface
  • ButterCMS Feature Image Upload images and media
  • ButterCMS Feature Image Edit slugs and meta tags
  • ButterCMS Feature Image Tag and categorize posts
  • ButterCMS Feature Image RSS/Atom Feeds
  • ButterCMS Feature Image Search
  • ButterCMS Feature Image Webhooks

Powerful admin interface

Integrates with Python

Our blog engine has a simple API and drop-in Python SDK.

Save development time

Save thousands of dollars worth of development time with our easy setup.

Gives you great SEO

Host your blog on your main domain and customize slugs and meta tags.

Try ButterCMS in your Python app

Setup in minutes

Official Python Guide

Integrating Butter into your Python app is dead simple. Here's a mini tutorial to get a feel for of setting up your blog home and blog post pages. For full a integration guide check out our Official Python Guide

To display posts, add a blog app to your Django project. This will serve as the basis of your blog home and individual post pages. The home page will display a list of 10 most recent posts.

python startapp blog

Set up a new url route to this blog app in our project's global file (i.e. myproject/myproject/

urlpatterns = [
    url(r'^blog/', include('blog.urls'))

Define the blog home route in blog/

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.home, name='blog'),
    url(r'^page/(?P<page>\d+)$', views.home, name='archive'),

Note there's also an archive named route for letting users paginate through older blog posts. It points to home view and passes in page as a param.

Then set up our home view in blog/ and fetch blog posts from the Butter API. The response also includes some metadata we'll use for pagination.

from django.http import Http404
from django.shortcuts import render
from butter_cms import ButterCMS

client = ButterCMS('your_token')

def home(request, page=1):
    response = client.posts.all({'page_size': 10, 'page': page})

        recent_posts = response['data']
        # In the event we request an invalid page number, no data key will exist in response.
        raise Http404('Page not found')

    next_page = response['meta']['next_page']
    previous_page = response['meta']['previous_page']

    return render(request, 'blog_base.html', {
        'recent_posts': recent_posts,
        'next_page': next_page,
        'previous_page': previous_page

Next we'll create the blog_base.html template that displays our posts and pagination links:


<!-- List of posts -->
{% for post in recent_posts %}
    <a href="{% url 'blog_post' post.slug %}">{{ post.title }}</a>
{% endfor %}

<!-- Pagination links -->
  {% if previous_page %}
  <a href="{% url "archive" previous_page %}">Prev</a>
  {% endif %}

  {% if next_page %}
  <a href="{% url "archive" next_page %}">Next</a>
  {% endif %}

We'll also create an additional route + view for displaying individual posts:

# in blog/

urlpatterns = [
    url(r'^$', views.home, name='blog'),
    url(r'^page/(?P<page>\d+)$', views.home, name='archive'),

    url(r'^(?P<slug>.*)$',, name='blog_post'),
# in blog/

def post(request, slug):
        response = client.posts.get(slug)
        raise Http404('Post not found')

    post = response['data']
    return render(request, 'blog_post.html', {
        'post': post

The view for displaying a full post includes information such as author, publish date, and categories. See a full list of available post properties in our API reference.

<title>{{ post.seo_title }}</title>
<meta name="description" content="{{ post.meta_description }}">

<!-- Post title -->
<h2>{{ post.title }}</h2>

<!-- Post author + Publish date -->
Posted by <a href="{% url 'blog_author' author.slug %}">{{ }} {{ }}</a> on {{ post.published }}

<!-- Post categories -->
{% for category in post.categories %}
<a href="{% url 'blog_category' category.slug %}">{{ }}</a>
{% endfor %}

<!-- Post body -->
{{ post.body|safe }}
Try ButterCMS in your Python app

About ButterCMS

ButterCMS is an API-based, or "headless", CMS. We're a hosted service and we maintain all of the infrastructure. For more information on how we compare to a traditional CMS check out API-based CMS vs Traditional CMS.

How do you compare to Wordpress?

In short, we offer all the same easy-to-use editing capabilities of Wordpress but are significantly easier for developers to setup and maintain. This means you spend less time working on your CMS and more time focusing on things important to your business.

Learn more about how we're a wordpress alternative.

What's my blog going to look like?

Unlike CMS's you might be used to, we don't control or host any of your templates. The design of your blog (HTML + CSS) lives in your application along side the rest of your app. Your application calls our Blog Engine API to get the raw blog post content and then injects it into your own templates during rendering. This has many benefits including blog your instantly matching the rest of your site branding giving it a unique feel; not the cookie-cutter blog themes you'll experience with other CMS's.

Can I import my existing blog content?

Yep. To import content from another platform, simply send us an email.

What kind of database can I use?

No database required! We're a SaaS CMS or CaaS. You simply call our Content API from your app. We host and maintain all of the CMS infrastructure.

Can I host this?

No, we're a SaaS CMS or CaaS. You simply call our Content API from your app. We host and maintain all of the CMS infrastructure.

I have other questions

We're happy to help.

Chat with us

About Python

Python is a widely used high-level programming language for general-purpose programming, created by Guido van Rossum and first released in 1991.

Blog Engine for these technologies and more

Ruby, Rails, Node.js, Python, ASP.NET, C#, Flask, Django, Go, PHP, React, Phoenix, Elixir, Angular, Vue.js

Try Butter free for 30-days

Try ButterCMS in your Python app

Get started now

Sign up with Google Sign up with Github