Initiated git repo and enabled lfs for quotes db
This commit is contained in:
commit
49a2dca576
|
@ -0,0 +1,25 @@
|
||||||
|
# Для начала
|
||||||
|
|
||||||
|
Требуется установленный Python 3.8+ в системе, охуенно если Python 3.10
|
||||||
|
|
||||||
|
1. Настроить virtualenv:
|
||||||
|
`python -m venv .venv`
|
||||||
|
|
||||||
|
2. Активировать virtualenv:
|
||||||
|
`. .venv/bin/activate`
|
||||||
|
|
||||||
|
3. Установить зависимости:
|
||||||
|
`pip install -r requirements.txt`
|
||||||
|
|
||||||
|
4. Запустить main.py
|
||||||
|
`python main.py`
|
||||||
|
|
||||||
|
# Прочая инфа
|
||||||
|
|
||||||
|
Стандартный порт 8001, он должен быть открыт для tcp соедений.
|
||||||
|
Порт можно поправить в main.py, последние строчки.
|
||||||
|
|
||||||
|
```python3
|
||||||
|
if __name__ == "__main__":
|
||||||
|
uvicorn.run(app, port=8001, host="0.0.0.0")
|
||||||
|
```
|
|
@ -0,0 +1,125 @@
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
from fastapi import FastAPI, HTTPException
|
||||||
|
from fastapi.responses import HTMLResponse, PlainTextResponse, RedirectResponse
|
||||||
|
import uvicorn
|
||||||
|
|
||||||
|
import sqlite3
|
||||||
|
from contextlib import closing
|
||||||
|
from random import choice
|
||||||
|
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
con = sqlite3.connect("file:quotes.sqlite3?mode=ro", uri=True, check_same_thread=False)
|
||||||
|
con1 = sqlite3.connect("file:tmp1?mode=memory&cache=shared", uri=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Quote(BaseModel):
|
||||||
|
id: int
|
||||||
|
text: str
|
||||||
|
datetime: int
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/")
|
||||||
|
async def read_root():
|
||||||
|
return {"Hello": "World"}
|
||||||
|
|
||||||
|
|
||||||
|
def htmlize(data: str):
|
||||||
|
text = data.replace('\n', '<br>').strip()
|
||||||
|
container = f'<html><head><title>Quote</title></head><body>{text}</body></html>'
|
||||||
|
return container
|
||||||
|
|
||||||
|
|
||||||
|
def to_href(id: int):
|
||||||
|
return f"<a href=\"/items/{id}\">{id}</a> "
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/items/all")
|
||||||
|
async def get_all(format: Union[str, None] = None):
|
||||||
|
with closing(con.cursor()) as cursor:
|
||||||
|
data = cursor.execute("SELECT \"id\" from `quotes`").fetchall()
|
||||||
|
|
||||||
|
#id_list = []
|
||||||
|
#for i in data:
|
||||||
|
# id_list.append(to_href(i[0]))
|
||||||
|
if format=='text':
|
||||||
|
id_list = [str(i[0]) for i in data]
|
||||||
|
text = '\n'.join(id_list)
|
||||||
|
|
||||||
|
return PlainTextResponse(content=text)
|
||||||
|
else:
|
||||||
|
id_list = [to_href(i[0]) for i in data]
|
||||||
|
text = ''.join(id_list)
|
||||||
|
|
||||||
|
return HTMLResponse(content=htmlize(text), status_code=200)
|
||||||
|
#return None
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/items/random")
|
||||||
|
async def read_random():
|
||||||
|
with closing(con.cursor()) as cursor:
|
||||||
|
data = cursor.execute("SELECT \"id\" from `quotes`").fetchall()
|
||||||
|
choice_target = choice(data)
|
||||||
|
text = cursor.execute("SELECT * from `quotes` WHERE id=?", choice_target).fetchone()
|
||||||
|
|
||||||
|
return PlainTextResponse(content=text[1], status_code=200)
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/items/getrandom")
|
||||||
|
async def read_getrandom():
|
||||||
|
with closing(con.cursor()) as cursor:
|
||||||
|
data = cursor.execute("SELECT \"id\" from `quotes`").fetchall()
|
||||||
|
|
||||||
|
id_list = [i[0] for i in data]
|
||||||
|
to_id = choice(id_list)
|
||||||
|
print(to_id)
|
||||||
|
|
||||||
|
return RedirectResponse(url=f'/items/{to_id}')
|
||||||
|
#return None
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/random")
|
||||||
|
async def redirect_to_random():
|
||||||
|
return RedirectResponse(url="/items/getrandom")
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/items/{item_id}")
|
||||||
|
async def read_item(item_id: int, format: Union[str, None] = None):
|
||||||
|
|
||||||
|
with closing(con.cursor()) as cursor:
|
||||||
|
text = cursor.execute("SELECT * from `quotes` WHERE id=?", (item_id,)).fetchone()
|
||||||
|
print(text)
|
||||||
|
|
||||||
|
if text:
|
||||||
|
if format == 'json':
|
||||||
|
return {"id:": text[0], "text": text[1], "time:": text[2]}
|
||||||
|
elif format == 'html':
|
||||||
|
return HTMLResponse(content=htmlize(text[1]), status_code=200)
|
||||||
|
elif format == 'raw':
|
||||||
|
return text
|
||||||
|
elif format == 'rawtext':
|
||||||
|
return text[1]
|
||||||
|
else:
|
||||||
|
return PlainTextResponse(content=text[1], status_code=200)
|
||||||
|
else:
|
||||||
|
#return HTMLResponse(content=None, status_code=404)
|
||||||
|
raise HTTPException(status_code=404, detail="Item not found")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/items/{item_id}/next")
|
||||||
|
async def redirect_to_next(item_id: int):
|
||||||
|
return RedirectResponse(url=f"/items/{item_id+1}")
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/items/{item_id}/prev")
|
||||||
|
async def redirect_to_previous(item_id: int):
|
||||||
|
return RedirectResponse(url=f"/items/{item_id-1}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
uvicorn.run(app, port=8001, host="0.0.0.0")
|
Binary file not shown.
|
@ -0,0 +1,10 @@
|
||||||
|
anyio==3.6.1
|
||||||
|
click==8.1.3
|
||||||
|
fastapi==0.79.0
|
||||||
|
h11==0.13.0
|
||||||
|
idna==3.3
|
||||||
|
pydantic==1.9.2
|
||||||
|
sniffio==1.2.0
|
||||||
|
starlette==0.19.1
|
||||||
|
typing-extensions==4.3.0
|
||||||
|
uvicorn==0.18.2
|
Loading…
Reference in New Issue