首頁 >後端開發 >Python教學 >反思部落格:我建立房地產清單 API 的旅程

反思部落格:我建立房地產清單 API 的旅程

WBOY
WBOY原創
2024-09-03 10:53:061028瀏覽

Reflective Blog: My Journey Building a Real Estate Listing API

反思部落格:我建立房地產清單 API 的旅程


介紹

當我第一次開始建立 Real Estate Listing API 時,我不太清楚自己要做什麼。作為一名入門級軟體開發人員,從頭開始開發 API 的想法似乎令人生畏。但我渴望挑戰自己,並測試我的 Python 和 SQL 知識。現在,回顧這段旅程,我對自己學到的東西感到驚訝——不僅僅是編碼,還包括堅持不懈的重要性、解決問題的樂趣以及看到項目實現的興奮.

這篇部落格文章反映了我建立這個初學者房地產清單 API 應用程式的經驗。我將分享關於 Python 和 SQL 的高潮和低潮、關鍵學習時刻以及一些有用的技術見解,這些見解使這個專案既具有挑戰性又有價值。


開始:學習 Python 基礎知識

我的旅程從 Python 基礎開始。我首先學習基礎知識:資料類型、控制流程、函數和物件導向程式設計。 Python的簡單性和可讀性讓我更容易快速掌握這些概念。然而,當我必須應用這些基礎知識來解決現實世界的問題時,真正的挑戰來了。

理解物件導向程式設計(OOP)是一個重要的里程碑。我意識到,透過使用類別和對象,我可以在我的房地產清單 API 中建立一種結構化的方式來處理不同的實體,例如使用者和屬性。這為我的專案奠定了基礎,我需要對使用者、屬性和應用程式等現實世界的實體進行建模。

例如,在我的 API 中,我使用 Python 類別定義了一個使用者模型,這幫助我理解不同實體之間的關係以及它們如何在系統內互動。這是我的使用者模型的簡化版本:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, nullable=False)
    email = db.Column(db.String, nullable=False, unique=True)
    password = db.Column(db.String, nullable=False)
    role = db.Column(db.Enum('agent', 'property_owner', 'buyer', name='user_roles'), nullable=False)

    properties = db.relationship('Property', backref='owner', lazy=True)
    applications = db.relationship('Application', backref='applicant', lazy=True)
    favorites = db.relationship('Property', secondary='wishlist', backref='favorited_by', lazy='dynamic')

這是我第一次真正接觸到如何使用 Python 在程式碼中表示現實世界的對象,它為我打開了一個充滿可能性的全新世界。


深入探討:建立房地產 API

當我對 Python 和物件導向程式設計有了基本了解後,我決定開始建立 Real Estate Listing API。目標很簡單:建立一個 API,允許業主列出房產,並允許潛在的租戶/買家瀏覽、申請和管理他們喜歡的房產。然而,實現這一目標需要的不僅僅是基礎知識。

使用 Flask 進行 RESTful API 開發

Flask 是一個輕量級的 Python Web 框架,成為我建立 API 的首選工具。我喜歡 Flask 的簡單性和靈活性;它提供了足夠的結構來幫助我入門,而不會讓我因不必要的複雜性而感到不知所措。

我先設定路由來處理不同的 HTTP 方法,如 GET、POST、PATCH 和 DELETE。這使我能夠為屬性、使用者、應用程式和願望清單實現核心 CRUD(建立、讀取、更新、刪除)操作。我很快就了解到的一件事是返回適當的 HTTP 狀態代碼和回應的重要性。例如,成功的 POST 請求應傳回 201 Created 狀態,而對不存在資源的請求應傳回 404 Not Found。

這是我建立的用於透過 ID 取得屬性的路由範例:

@app.route('/properties/<int:id>', methods=['GET'])
def get_property(id):
    property = Property.query.get(id)
    if property:
        return jsonify(property_schema.dump(property)), 200
    else:
        return jsonify({'error': 'Property not found'}), 404

這段程式碼幫助我了解如何處理不同的場景並確保 API 向客戶提供有意義的回饋。

實作 SQLAlchemy 進行資料庫互動

建立此 API 的另一個關鍵部分是學習如何使用 SQLAlchemy 與資料庫進行交互,SQLAlchemy 是一種連接 Python 類別和 SQL 資料庫的 ORM(物件關聯映射)工具。我選擇 SQLAlchemy 是因為它與 Flask 整合得很好,並且簡化了 SQL 的許多複雜方面,例如建立和管理表之間的關係。

我使用的 SQLAlchemy 最有用的技術方面之一是建立多對多關係。例如,在我的房地產 API 中,使用者可以收藏多個房產,並且每個房產可以被許多使用者收藏。為了對此進行建模,我使用了一個名為 Wishlist 的連結表來管理這種多對多關係:

wishlist_table = db.Table('wishlist',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('property_id', db.Integer, db.ForeignKey('property.id'), primary_key=True)
)

這個片段使我能夠有效地管理使用者-屬性關係,而無需建立冗餘資料。透過使用 SQLAlchemy 的關係函數,我可以輕鬆地查詢和管理這些連接。

使用 Flask-Marshmallow 進行序列化

Another important learning experience was using Flask-Marshmallow to serialize my SQLAlchemy models into JSON format. Serialization converts complex data types into a format that can be easily transferred over the network, which is essential for building APIs. I used Marshmallow schemas to define how my models should be converted to JSON. Here's an example schema for my Property model:

class PropertySchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Property
        load_instance = True

property_schema = PropertySchema()
properties_schema = PropertySchema(many=True)

Using Marshmallow simplified the process of converting my models to JSON, allowing me to focus on building out the core functionality of the API.


Looking Back: Reflecting on the Journey

Looking back, I realize how far I've come in just a short time. When I started, I barely knew the basics of Python. Now, I've built a full-fledged API that uses Flask, SQLAlchemy, and Marshmallow, and I have a much deeper understanding of web development.

One of the most rewarding aspects of this journey was the feeling of solving problems. Every error message, every bug, and every unexpected behavior taught me something new. Whether it was figuring out why a route wasn't working, debugging a database connection issue, or learning how to properly handle CORS, each challenge helped me grow as a developer.

But perhaps the most important lesson I've learned is the value of persistence. There were times when I felt stuck or frustrated, but I kept pushing forward. I learned to break problems down into smaller, more manageable pieces and tackle them one by one.


A Useful Technical Insight: Flask CORS Configuration

One technical aspect I found particularly useful was configuring Cross-Origin Resource Sharing (CORS) in my Flask application. CORS is crucial for allowing web applications hosted on different domains to communicate with each other. In my case, it allowed the frontend (built with React) to make requests to the backend API without getting blocked by the browser's same-origin policy.

Here's how I set up CORS in my Flask app:

from flask_cors import CORS

app = Flask(__name__)
CORS(app)

By simply adding CORS(app), I enabled cross-origin requests for all routes in my app, which made the integration between my frontend and backend much smoother. This is a small but powerful feature that every web developer should know.


Conclusion

Building the Real Estate Listing API was a challenging but immensely rewarding experience. I learned so much about Python, SQL, and web development, and I feel much more confident in my abilities as a developer. I'm excited to continue building, learning, and growing in this field, and I can't wait to see what the future holds.

For anyone just starting out, my advice is simple: keep learning, keep experimenting, and don't be afraid to make mistakes. Every challenge is an opportunity to grow, and every project is a step forward on your journey as a developer.

https://github.com/migsldev/real-estate-api

以上是反思部落格:我建立房地產清單 API 的旅程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn