-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
87 lines (76 loc) · 2.28 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import random
import asyncio
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from databases import Database
from faker import Faker
from datetime import datetime, timedelta
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
database = Database("sqlite:///./local.db")
def generate_tweet():
tweet = {
"tweet": fake.sentence(nb_words=10),
"username": fake.user_name(),
"tag": f"@{fake.user_name()}",
"likes": random.randint(0, 1000),
"comments": random.randint(0, 500),
"reshares": random.randint(0, 200),
"date": (datetime.now() - timedelta(days=random.randint(0, 365))).strftime("%Y-%m-%d %H:%M:%S"),
}
return tweet
tweets = []
for i in range(100):
fake = Faker()
if random.randint(0, 1) == 0:
fake = Faker("fr_FR")
tweet = {**generate_tweet()}
tweets.append(tweet)
# Data model for tweets
class Tweet:
def __init__(self, tweet_id, username, text):
self.tweet_id = tweet_id
self.username = username
self.text = text
# API route to search for tweets based on text
@app.get("/tweets")
async def search_tweets(content: str):
query = "SELECT * FROM tweets WHERE tweet LIKE :content"
results = await database.fetch_all(query=query, values={"content": f"%{content}%"})
return results
@app.on_event("startup")
async def startup_db_client():
await database.connect()
await database.execute("DROP TABLE IF EXISTS tweets;")
await database.execute(
"""
CREATE TABLE IF NOT EXISTS tweets (
tweet_id INTEGER PRIMARY KEY AUTOINCREMENT,
tweet TEXT,
username TEXT,
tag TEXT,
likes INT,
comments INT,
reshares INT,
date DATE
)
"""
)
columns = list(tweets[0].keys())
query = "INSERT INTO tweets ({}) VALUES ({})".format(
", ".join(columns),
", ".join([f":{col}" for col in columns])
)
for tweet in tweets:
await database.execute(query, tweet)
@app.on_event("shutdown")
async def shutdown_db_client():
await database.disconnect()
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="127.0.0.1", port=5000)