use python plotly dash create blog app
To upload files, please first save the app
import streamlit as st
import plotly.express as px
import plotly.graph_objects as go
import datetime
# Initialize session state for posts if not exists
if "posts" not in st.session_state:
st.session_state.posts = []
st.title("Blog Dashboard")
# Sidebar for adding new posts
with st.sidebar:
st.header("Add New Post")
title = st.text_input("Post Title")
content = st.text_area("Post Content")
tags = st.text_input("Tags (comma-separated)")
if st.button("Add Post"):
if title and content:
post = {
"title": title,
"content": content,
"tags": [tag.strip() for tag in tags.split(",")] if tags else [],
"date": datetime.datetime.now(),
"views": 0
}
st.session_state.posts.append(post)
st.success("Post added successfully!")
# Main content area
tab1, tab2, tab3 = st.tabs(["Posts", "Analytics", "Tags"])
with tab1:
st.header("Blog Posts")
for idx, post in enumerate(st.session_state.posts):
with st.expander(f"{post['title']} - {post['date'].strftime('%Y-%m-%d')}"):
st.write(post['content'])
st.write(f"Tags: {', '.join(post['tags'])}")
if st.button("Increment Views", key=f"view_{idx}"):
st.session_state.posts[idx]['views'] += 1
st.rerun()
with tab2:
st.header("Analytics")
if st.session_state.posts:
# Views per post
fig_views = px.bar(
x=[post['title'] for post in st.session_state.posts],
y=[post['views'] for post in st.session_state.posts],
title="Views per Post"
)
st.plotly_chart(fig_views, use_container_width=True)
# Tags distribution
all_tags = []
for post in st.session_state.posts:
all_tags.extend(post['tags'])
if all_tags:
tag_counts = {}
for tag in all_tags:
tag_counts[tag] = tag_counts.get(tag, 0) + 1
fig_tags = px.pie(
values=list(tag_counts.values()),
names=list(tag_counts.keys()),
title="Tag Distribution"
)
st.plotly_chart(fig_tags, use_container_width=True)
# Posts over time
dates = [post['date'] for post in st.session_state.posts]
fig_timeline = px.line(
x=dates,
y=range(1, len(dates) + 1),
title="Cumulative Posts Over Time"
)
st.plotly_chart(fig_timeline, use_container_width=True)
else:
st.info("No posts yet. Add some posts to see analytics!")
with tab3:
st.header("Tag Cloud")
if st.session_state.posts:
# Get all unique tags
unique_tags = set()
for post in st.session_state.posts:
unique_tags.update(post['tags'])
# Create tag filters
selected_tag = st.selectbox("Filter by tag", ["All"] + list(unique_tags))
# Filter posts by tag
if selected_tag != "All":
filtered_posts = [
post for post in st.session_state.posts
if selected_tag in post['tags']
]
else:
filtered_posts = st.session_state.posts
# Display filtered posts
for post in filtered_posts:
st.subheader(post['title'])
st.write(post['content'][:200] + "..." if len(post['content']) > 200 else post['content'])
st.write(f"Tags: {', '.join(post['tags'])}")
st.write("---")
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?