」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 反思部落格:我建立房地產清單 API 的旅程

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

發佈於2024-11-03
瀏覽:140

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/', 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 进行序列化

另一个重要的学习经验是使用 Flask-Marshmallow 将我的 SQLAlchemy 模型序列化为 JSON 格式。序列化将复杂的数据类型转换为可以轻松通过网络传输的格式,这对于构建 API 至关重要。我使用 Marshmallow 模式来定义如何将我的模型转换为 JSON。这是我的属性模型的示例架构:

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

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

使用 Marshmallow 简化了将模型转换为 JSON 的过程,使我能够专注于构建 API 的核心功能。


回顾:反思旅程

回首往事,我意识到我在短短的时间内已经走了多远。刚开始的时候,我对 Python 的基础知识几乎一无所知。现在,我已经使用 Flask、SQLAlchemy 和 Marshmallow 构建了一个成熟的 API,并且我对 Web 开发有了更深入的了解。

这段旅程中最有价值的方面之一就是解决问题的感觉。每条错误消息、每一个错误和每一个意外行为都教会了我一些新东西。无论是找出路由不起作用的原因、调试数据库连接问题,还是学习如何正确处理 CORS,每个挑战都帮助我成长为一名开发人员。

但也许我学到的最重要的一课是坚持的价值。有时我感到陷入困境或沮丧,但我继续前进。我学会了将问题分解成更小、更易于管理的部分,然后一一解决。


有用的技术见解:Flask CORS 配置

我发现特别有用的一个技术方面是在我的 Flask 应用程序中配置跨域资源共享 (CORS)。 CORS 对于允许托管在不同域上的 Web 应用程序相互通信至关重要。就我而言,它允许前端(使用 React 构建)向后端 API 发出请求,而不会被浏览器的同源策略阻止。

以下是我在 Flask 应用程序中设置 CORS 的方法:

from flask_cors import CORS

app = Flask(__name__)
CORS(app)

通过简单地添加 CORS(app),我为应用程序中的所有路由启用了跨域请求,这使得我的前端和后端之间的集成更加顺畅。这是每个 Web 开发人员都应该知道的小而强大的功能。


结论

构建 Real Estate Listing API 是一次充满挑战但收获颇丰的经历。我学到了很多关于 Python、SQL 和 Web 开发的知识,我对自己作为开发人员的能力更有信心了。我很高兴能够在这个领域继续建设、学习和成长,我迫不及待地想看看未来会怎样。

对于刚刚起步的人,我的建议很简单:不断学习,不断尝试,不要害怕犯错误。每个挑战都是成长的机会,每个项目都是您作为开发人员的旅程中向前迈出的一步。

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

版本聲明 本文轉載於:https://dev.to/migsldev/reflective-blog-my-journey-building-a-real-estate-listing-api-390o?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-07-14
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-07-14
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-07-14
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-07-14
  • `console.log`顯示修改後對象值異常的原因
    `console.log`顯示修改後對象值異常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    程式設計 發佈於2025-07-14
  • 如何在Java的全屏獨家模式下處理用戶輸入?
    如何在Java的全屏獨家模式下處理用戶輸入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    程式設計 發佈於2025-07-14
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。 isement(Isement() trim whitespace whites...
    程式設計 發佈於2025-07-14
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-07-14
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-07-14
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-07-14
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-07-14
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限期擴展,超過了視口的高度,阻止用戶訪問頁面頁腳。 $("#map").css({ margin...
    程式設計 發佈於2025-07-14
  • 為什麼不使用CSS`content'屬性顯示圖像?
    為什麼不使用CSS`content'屬性顯示圖像?
    在Firefox extemers屬性為某些圖像很大,&& && && &&華倍華倍[華氏華倍華氏度]很少見,卻是某些瀏覽屬性很少,尤其是特定於Firefox的某些瀏覽器未能在使用內容屬性引用時未能顯示圖像的情況。這可以在提供的CSS類中看到:。 googlepic { 內容:url(&...
    程式設計 發佈於2025-07-14
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-07-14
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-07-14

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3