DEV Community

migsldev
migsldev

Posted on

Reflecting on My Journey: Building a Beginner Real Estate Listing Fullstack App

When I first started learning Python, I had no idea where the journey would take me. I remember diving into Python tutorials, struggling with basic concepts like loops, functions, and object-oriented programming. Fast forward to today, I've built a full-stack Real Estate Listing app using a combination of Flask for the backend and React for the frontend. This project was not only a challenge but also an incredible learning experience that helped me grow as a developer. Let me take you through this journey and highlight some of the key aspects I learned while building this app.

The Beginnings: Learning the Fundamentals of Python

When I started with Python, I knew it was a versatile and beginner-friendly language. However, like most beginners, I faced my share of challenges. Understanding the syntax, learning how to debug, and getting familiar with Python's libraries were all hurdles I had to overcome. I spent countless hours working on small projects, like a simple calculator and a to-do list CLI app, to grasp the basics.

These foundational exercises paid off when I started working on my Real Estate Listing app. The basics of Python were essential for writing clean, efficient code, especially when creating models and handling data for the app.

I started by building the backend using Flask, a lightweight web framework. Flask is simple to use, but it also requires a good understanding of Python fundamentals. My initial steps involved setting up a virtual environment and structuring the project, ensuring that all the necessary libraries were installed, such as SQLAlchemy for ORM (Object Relational Mapping), which simplified database interactions.

Building the Backend with Flask

The backend of the Real Estate Listing app was designed to handle user authentication, property listings, applications, and wishlists. This required me to create several models, including User, Property, and Application, each with its own set of fields and relationships.

Here's a snippet of how I defined the User model using SQLAlchemy:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    email = db.Column(db.String(100), unique=True, nullable=False)
    password = db.Column(db.String(100), nullable=False)
    # Relationships
    properties = db.relationship('Property', backref='owner', lazy=True)
Enter fullscreen mode Exit fullscreen mode

This code snippet shows the creation of a User model with fields like username, email, and password. I also set up a one-to-many relationship with the Property model, which was crucial for linking users (agents) to the properties they listed.

Tackling Frontend Challenges with React

While the backend was mostly straightforward due to my familiarity with Python, the frontend presented a whole new challenge. I chose React for its component-based architecture and vibrant ecosystem. However, learning React meant diving into JavaScript – a language I was less familiar with.

I started by creating reusable components for different parts of the application, such as the property listing page, the user registration page, and the application management page. For instance, the PropertyAgent component allowed agents to create, edit, and delete property listings:

import React, { useState, useEffect } from 'react';
import axios from 'axios';
import './PropertyAgent.css';

const PropertiesAgent = () => {
    const [properties, setProperties] = useState([]);
    const [newProperty, setNewProperty] = useState({ title: '', description: '', price: '', location: '', property_type: 'Apartment' });
    const [error, setError] = useState('');
    const [success, setSuccess] = useState('');

    useEffect(() => {
        fetchProperties();
    }, []);

    const fetchProperties = async () => {
        try {
            const response = await axios.get('/properties', {
                headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }
            });
            setProperties(response.data || []);
        } catch (error) {
            setError('Error fetching properties');
        }
    };

    const handleCreateProperty = async (event) => {
        event.preventDefault();
        try {
            await axios.post('/properties', newProperty, {
                headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }
            });
            setSuccess('Property created successfully!');
            fetchProperties();
        } catch (error) {
            setError('Error creating property');
        }
    };

    return (
        <div>
            {/* JSX for rendering the properties and the form to create a new property */}
        </div>
    );
};

export default PropertiesAgent;
Enter fullscreen mode Exit fullscreen mode

This code snippet illustrates the use of React hooks (useState and useEffect) to manage state and handle side effects, such as fetching data from the backend API.

A Useful Technical Aspect: Understanding JavaScript's Asynchronous Nature

One of the most important aspects I learned while working with React and JavaScript was how to handle asynchronous operations. JavaScript's non-blocking, asynchronous nature can be a bit daunting for beginners, especially when dealing with API calls.

For example, fetching data from the backend requires the use of asynchronous functions with async/await syntax:

const fetchProperties = async () => {
    try {
        const response = await axios.get('/properties', {
            headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }
        });
        setProperties(response.data || []);
    } catch (error) {
        setError('Error fetching properties');
    }
};
Enter fullscreen mode Exit fullscreen mode

Using async/await makes the code more readable and easier to debug compared to using promises. It also ensures that data is fetched before any operations dependent on that data are executed, which is crucial for maintaining a seamless user experience.

Looking Back: The Growth from Python Basics to Full-Stack Development

Looking back, the journey from learning Python basics to building a full-stack application has been incredibly rewarding. I've not only improved my coding skills but also gained valuable experience in working with different technologies and frameworks.

Building this Real Estate Listing app taught me the importance of having a strong foundation in programming fundamentals. It also reinforced the idea that learning never stops in software development. There is always a new framework, library, or tool to master, and each project presents its own unique set of challenges.

One of the most fulfilling aspects of this journey has been seeing the app come to life. From setting up the backend to handling user authentication and building dynamic, responsive front-end components, every step was a learning opportunity.

Conclusion

In conclusion, working on this Real Estate Listing app was an invaluable experience that highlighted the importance of perseverance, continuous learning, and an openness to tackling new challenges. As I continue to grow as a developer, I am excited about what the future holds and the new skills and knowledge I will acquire along the way.

If you're just starting out, my advice is to keep coding, keep learning, and don't be afraid to take on projects that push you outside of your comfort zone. Every bug you fix, every new technology you learn, and every project you complete is a step closer to becoming a proficient developer.

https://github.com/migsldev/real_estate_listing_app

Top comments (0)