Download app.py from thoptk/vodanh: direct link, hf CLI and curl.
- Browser
- Download file 3.25 kB
-
https://huggingface.co/spaces/thoptk/vodanh/resolve/main/app.py
- Command line
-
hf download hf://spaces/thoptk/vodanh/app.py
-
curl -L -o app.py https://huggingface.co/spaces/thoptk/vodanh/resolve/main/app.py
3.25 kB
| import os # Nhớ thêm dòng này ở đầu file | |
| import pandas as pd | |
| from flask import Flask, render_template | |
| # Khởi tạo ứng dụng Flask | |
| app = Flask(__name__) | |
| # --- LINK CSV CỦA BẠN --- | |
| PRODUCT_SHEET_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSHOvfG4hGVCBQYsjOpC0QhamhVKWwFojz4IRc32B6HOvRDaEqc9dNRy8E8pLyJDnDo2mGvJ4oJANtk/pub?gid=319581950&single=true&output=csv" | |
| VIDEO_SHEET_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSHOvfG4hGVCBQYsjOpC0QhamhVKWwFojz4IRc32B6HOvRDaEqc9dNRy8E8pLyJDnDo2mGvJ4oJANtk/pub?gid=1503614356&single=true&output=csv" | |
| # ------------------------------------- | |
| def load_data(url): | |
| """ | |
| Hàm tải dữ liệu từ Google Sheet CSV và trả về danh sách (list of dictionaries). | |
| """ | |
| try: | |
| df = pd.read_csv(url, dtype=str) | |
| df = df.fillna("") | |
| return df.to_dict('records') | |
| except Exception as e: | |
| print(f"[LỖI LOAD_DATA] Lỗi khi tải dữ liệu từ {url}: {e}") | |
| return [] | |
| def home(): | |
| """Trang chủ của website""" | |
| products_raw = load_data(PRODUCT_SHEET_URL) | |
| videos = load_data(VIDEO_SHEET_URL) | |
| products_processed = [] | |
| for product in products_raw: | |
| try: | |
| # === SỬA LỖI 1: Đọc đúng tên cột Cột D === | |
| # Đọc từ cột 'image_id' (thay vì 'image_url' như code trước) | |
| file_id = product.get('image_id') | |
| if file_id: | |
| # Tạo biến mới 'image_url_processed' | |
| product['image_url_processed'] = f"https://drive.google.com/thumbnail?id={file_id}&sz=w500" | |
| else: | |
| # Nếu không có ID, dùng ảnh dự phòng | |
| product['image_url_processed'] = "https://placehold.co/300x300/eee/333?text=No+Image" | |
| # === SỬA LỖI 2: Đọc đúng tên cột Cột E === | |
| # Đọc từ cột 'link_shopee' (thay vì 'shopee_link' như code trước) | |
| shopee_link = product.get('link_shopee', '') | |
| if shopee_link and not shopee_link.startswith(('http://', 'https://')): | |
| # Tự động thêm https:// nếu thiếu | |
| product['shopee_link_processed'] = f"https://{shopee_link}" | |
| elif not shopee_link: | |
| # Nếu ô bị rỗng, đặt link là '#' để tránh lỗi | |
| product['shopee_link_processed'] = '#' | |
| else: | |
| # Nếu link đã đúng, giữ nguyên | |
| product['shopee_link_processed'] = shopee_link | |
| # Thêm sản phẩm đã xử lý vào danh sách | |
| products_processed.append(product) | |
| except Exception as e: | |
| print(f"Lỗi xử lý sản phẩm {product.get('name')}: {e}") | |
| continue | |
| # Render file 'index.html' và truyền 2 biến mới vào | |
| return render_template('index.html', products=products_processed, videos=videos) | |
| if __name__ == '__main__': | |
| # Tự động lấy cổng (PORT) mà Hugging Face cung cấp, | |
| # nếu không có thì mặc định là 7860 | |
| port = int(os.environ.get("PORT", 7860)) | |
| app.run(host='0.0.0.0', port=port) |