{"id":3475,"date":"2026-06-11T09:41:49","date_gmt":"2026-06-11T09:41:49","guid":{"rendered":"https:\/\/www.mhtechin.com\/support\/?p=3475"},"modified":"2026-06-11T09:41:49","modified_gmt":"2026-06-11T09:41:49","slug":"api-integration-project-structure-logic-building-from-script-to-real-project","status":"publish","type":"post","link":"https:\/\/www.mhtechin.com\/support\/api-integration-project-structure-logic-building-from-script-to-real-project\/","title":{"rendered":"API Integration, Project Structure &amp; Logic Building \u2013 From Script to Real Project"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Introduction<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Knowing syntax is one thing. Building a real project is another. In this post, we\u2019ll cover:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>How to call APIs and handle JSON responses<\/li>\n\n\n\n<li>Structuring Python projects across multiple files<\/li>\n\n\n\n<li>The Contact Book mini-project that ties everything together<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">By the end, you\u2019ll have a blueprint for any Python application.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">API Integration: Fetching Live Data<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">APIs (Application Programming Interfaces) allow your code to talk to external services. Most modern APIs return JSON.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using the&nbsp;<code>requests<\/code>&nbsp;library<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import requests\n\nresponse = requests.get(\"https:\/\/api.github.com\/users\/octocat\")\nif response.status_code == 200:\n    data = response.json()  # Parse JSON\n    print(data[\"name\"])\nelse:\n    print(\"API call failed\")<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Common API Workflow<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Send HTTP request (GET, POST, etc.)<\/li>\n\n\n\n<li>Check status code (200 = OK, 404 = Not Found, 500 = Server Error)<\/li>\n\n\n\n<li>Parse JSON response<\/li>\n\n\n\n<li>Handle errors gracefully<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Example: Weather API<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">def get_weather(city):\n    url = f\"https:\/\/api.openweathermap.org\/data\/2.5\/weather?q={city}&amp;appid=YOUR_KEY\"\n    try:\n        response = requests.get(url, timeout=5)\n        response.raise_for_status()  # Raises exception for 4xx\/5xx\n        return response.json()\n    except requests.exceptions.RequestException as e:\n        return {\"error\": str(e)}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Always set a&nbsp;<code>timeout<\/code>&nbsp;and use&nbsp;<code>raise_for_status()<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Multi-File Project Structure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A professional Python project is never one huge file. You split by responsibility.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example Structure:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">text<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">contact_book\/\n\u2502\n\u251c\u2500\u2500 main.py          # Entry point\n\u251c\u2500\u2500 contact_manager.py   # Business logic\n\u251c\u2500\u2500 file_handler.py      # JSON read\/write\n\u251c\u2500\u2500 utils.py             # Helper functions\n\u2514\u2500\u2500 data\/\n    \u2514\u2500\u2500 contacts.json    # Storage<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">How Imports Work<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># In main.py\nfrom contact_manager import add_contact\nfrom file_handler import load_contacts<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use absolute imports for clarity. Avoid&nbsp;<code>from module import *<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>if __name__ == \"__main__\"<\/code>&nbsp;Explained<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This ensures code runs only when the script is executed directly, not when imported.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># main.py\ndef main():\n    print(\"Contact Book Started\")\n\nif __name__ == \"__main__\":\n    main()<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Contact Book Mini Project: Tying It All Together<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This project uses:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OOP (Contact class)<\/li>\n\n\n\n<li>File handling (JSON storage)<\/li>\n\n\n\n<li>Exception handling<\/li>\n\n\n\n<li>Multi-file structure<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Contact Class (OOP)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># models.py\nclass Contact:\n    def __init__(self, name, phone, email):\n        self.name = name\n        self.phone = phone\n        self.email = email\n\n    def to_dict(self):\n        return {\"name\": self.name, \"phone\": self.phone, \"email\": self.email}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">JSON Storage Handler<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># storage.py\nimport json\n\ndef save_contacts(contacts):\n    with open(\"data\/contacts.json\", \"w\") as file:\n        json.dump([c.to_dict() for c in contacts], file, indent=4)\n\ndef load_contacts():\n    try:\n        with open(\"data\/contacts.json\", \"r\") as file:\n            data = json.load(file)\n            return [Contact(**item) for item in data]\n    except FileNotFoundError:\n        return []<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Main Logic<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">python<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># main.py\ndef add_contact(contacts):\n    name = input(\"Name: \")\n    phone = input(\"Phone: \")\n    email = input(\"Email: \")\n    contacts.append(Contact(name, phone, email))\n    save_contacts(contacts)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is production-style code: modular, reusable, and error-resistant.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Skills You Build<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Logic building:<\/strong>\u00a0Breaking features into small functions<\/li>\n\n\n\n<li><strong>Debugging:<\/strong>\u00a0Using print statements and try-except<\/li>\n\n\n\n<li><strong>Real-world readiness:<\/strong>\u00a0Code that other developers can understand<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Knowing syntax is one thing. Building a real project is another. In this post, we\u2019ll cover: By the end, you\u2019ll have a blueprint for any Python application. API Integration: Fetching Live Data APIs (Application Programming Interfaces) allow your code to talk to external services. Most modern APIs return JSON. Using the&nbsp;requests&nbsp;library python import requests [&hellip;]<\/p>\n","protected":false},"author":69,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3475","post","type-post","status-publish","format-standard","hentry","category-support"],"_links":{"self":[{"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/posts\/3475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/users\/69"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/comments?post=3475"}],"version-history":[{"count":3,"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/posts\/3475\/revisions"}],"predecessor-version":[{"id":3486,"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/posts\/3475\/revisions\/3486"}],"wp:attachment":[{"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/media?parent=3475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/categories?post=3475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mhtechin.com\/support\/wp-json\/wp\/v2\/tags?post=3475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}