Building a Simple Blog App Using FastAPI, HTML, CSS, and JSON

WHAT TO KNOW - Sep 9 - - Dev Community

<!DOCTYPE html>



Building a Simple Blog App Using FastAPI, HTML, CSS, and JSON

<br> body {<br> font-family: Arial, sans-serif;<br> }</p> <div class="highlight"><pre class="highlight plaintext"><code>h1, h2, h3 { margin-top: 2em; } pre { background-color: #f0f0f0; padding: 1em; overflow-x: auto; } code { font-family: Consolas, monospace; } img { max-width: 100%; height: auto; } </code></pre></div> <p>



Building a Simple Blog App Using FastAPI, HTML, CSS, and JSON



In today's digital age, blogging has become an essential tool for individuals and organizations to share their thoughts, ideas, and experiences with the world. Building a blog platform from scratch might seem daunting, but with the power of modern web development frameworks, it can be a surprisingly straightforward process.



This article will guide you through building a simple blog application using FastAPI, a high-performance web framework for Python, along with HTML for structuring the content, CSS for styling, and JSON for data exchange. By the end of this tutorial, you will have a functional blog where you can create, view, and manage your blog posts.



Introduction: Why FastAPI?



FastAPI is a modern, fast (high-performance), and easy-to-use web framework for building APIs with Python. Its key advantages include:


  • High performance: FastAPI is built on top of Starlette, an asynchronous framework that makes it incredibly fast and efficient.
  • Type hints: FastAPI leverages Python's type hints to provide automatic documentation, validation, and error handling.
  • Automatic documentation: FastAPI generates interactive API documentation using Swagger and ReDoc.
  • Data validation: FastAPI automatically validates incoming data based on the types specified in your code, ensuring data consistency.
  • Asynchronous support: FastAPI allows you to build non-blocking applications, enabling efficient handling of multiple requests concurrently.


These features make FastAPI an ideal choice for building RESTful APIs, and it's particularly well-suited for creating dynamic web applications like our blog.



Setting up the Environment



Before we start coding, let's set up the necessary environment. You'll need the following:



  • Python
    : Download and install the latest version of Python from
    https://www.python.org/ .

  • Virtual Environment
    : A virtual environment is a recommended practice to isolate project dependencies. Use the following command to create a virtual environment:
python3 -m venv env


  • Activate the Environment
    : Once created, activate the virtual environment using the appropriate command for your operating system.

  • # Linux/macOS
    source env/bin/activate

    # Windows
    env\Scripts\activate



  • Install Dependencies
    : Install the necessary packages using pip:

  • pip install fastapi uvicorn python-multipart jinja2



    Project Structure



    We'll organize our project files for better clarity and maintainability:


    blog_app/
    ├── app.py
    ├── templates/
    │   └── index.html
    └── static/
        └── style.css
    


    Let's break down the purpose of each file:



    • app.py
      : This file contains the FastAPI application logic, including API routes and data handling.

    • templates/index.html
      : This file defines the HTML structure and content of our blog page.

    • static/style.css
      : This file contains the CSS styles for our blog page.


    Implementing the Blog Application


    1. Creating the FastAPI Application

    Start by creating the app.py file and define our FastAPI application:

    from fastapi import FastAPI, Request, Form, File, UploadFile
    from fastapi.responses import HTMLResponse
    from fastapi.templating import Jinja2Templates
    import json
    
    app = FastAPI()
    
    templates = Jinja2Templates(directory="templates")
    
    # Sample blog posts (store them in a file for simplicity)
    with open("blog_posts.json", "r") as f:
        posts = json.load(f)
    
    # Function to load blog posts from the JSON file
    def load_posts():
        with open("blog_posts.json", "r") as f:
            return json.load(f)
    
    # Function to save blog posts to the JSON file
    def save_posts(posts):
        with open("blog_posts.json", "w") as f:
            json.dump(posts, f)
    

    1. Defining API Routes

    Let's define the routes for our blog application. We'll have routes for:

    • / : The main blog page displaying all posts.
    • /create : A form for creating new blog posts.
    • /delete/{post_id} : A route to delete a specific post.
    @app.get("/", response_class=HTMLResponse)
    async def index(request: Request):
        posts = load_posts()
        return templates.TemplateResponse("index.html", {"request": request, "posts": posts})
    
    @app.get("/create", response_class=HTMLResponse)
    async def create(request: Request):
        return templates.TemplateResponse("create.html", {"request": request})
    
    @app.post("/create")
    async def create_post(request: Request, title: str = Form(...), content: str = Form(...), image: UploadFile = File(None)):
        posts = load_posts()
        new_post = {"id": len(posts) + 1, "title": title, "content": content, "image_url": ""}
    
        # Handle image upload (optional)
        if image is not None:
            image_content = await image.read()
            image_path = f"static/images/{image.filename}"
            with open(image_path, "wb") as f:
                f.write(image_content)
            new_post["image_url"] = f"/static/images/{image.filename}"
    
        posts.append(new_post)
        save_posts(posts)
        return {"message": "Post created successfully!"}
    
    @app.get("/delete/{post_id}")
    async def delete_post(post_id: int):
        posts = load_posts()
        posts = [post for post in posts if post["id"] != post_id]
        save_posts(posts)
        return {"message": "Post deleted successfully!"}
    

    1. Designing the Blog Page (index.html)

    Let's design the basic structure of our blog page using HTML:

      <!DOCTYPE html>
      <html>
       <head>
        <title>
         My Blog
        </title>
        <link href="/static/style.css" rel="stylesheet"/>
       </head>
       <body>
        <h1>
         My Blog
        </h1>
        <a href="/create">
         Create New Post
        </a>
        <ul>
         {% for post in posts %}
         <li>
          <h2>
           <a href="#">
            {{ post.title }}
           </a>
          </h2>
          <img alt="{{ post.title }}" src="{{ post.image_url }}"/>
          <p>
           {{ post.content }}
          </p>
          <a href="/delete/{{ post.id }}">
           Delete
          </a>
         </li>
         {% endfor %}
        </ul>
       </body>
      </html>
    

    1. Styling the Blog Page (style.css)

    Add some basic CSS styling to make the blog page presentable:

    body {
      font-family: Arial, sans-serif;
      margin: 0;
      padding: 20px;
    }
    
    h1 {
      text-align: center;
      margin-bottom: 20px;
    }
    
    ul {
      list-style: none;
      padding: 0;
    }
    
    li {
      border: 1px solid #ccc;
      padding: 15px;
      margin-bottom: 15px;
    }
    
    img {
      max-width: 100%;
      height: auto;
      margin-bottom: 10px;
    }
    

    1. Running the Application

    Finally, run the FastAPI application using uvicorn:

    uvicorn app:app --reload
    



    This will start the server, and you can access the blog at



    http://127.0.0.1:8000/



    in your web browser.






    Conclusion





    In this tutorial, we've successfully built a simple blog application using FastAPI, HTML, CSS, and JSON. We explored the key features of FastAPI, including its performance, type hints, and automatic documentation. We defined API routes for displaying posts, creating new posts, and deleting posts. We also designed a basic blog page using HTML and CSS.





    This is just a starting point, and you can further enhance the application by adding features like:





    • User authentication and authorization

      : Allow users to sign in and manage their own posts.


    • Comments section

      : Enable users to leave comments on blog posts.


    • Search functionality

      : Allow users to search for specific blog posts.


    • Pagination

      : Handle large numbers of posts efficiently by dividing them into pages.


    • Database integration

      : Store blog posts in a database for better scalability and data management.




    Remember that this guide is meant to be a starting point. Feel free to experiment, customize, and add your own creativity to build a unique and engaging blog platform. Happy blogging!




    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    Terabox Video Player