Initial working proof of concept

pull/383/head
Simon Willison 2017-10-22 17:41:19 -07:00
rodzic ac9d66817d
commit de04d7a854
5 zmienionych plików z 74 dodań i 0 usunięć

3
.gitignore vendored
Wyświetl plik

@ -99,3 +99,6 @@ ENV/
# mypy
.mypy_cache/
# SQLite databases
*.db

6
Dockerfile 100644
Wyświetl plik

@ -0,0 +1,6 @@
FROM python:3
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 8006
CMD ["python", "app.py"]

43
app.py 100644
Wyświetl plik

@ -0,0 +1,43 @@
from sanic import Sanic
from sanic import response
from sanic_jinja2 import SanicJinja2
import sqlite3
import json
app = Sanic(__name__)
jinja = SanicJinja2(app)
#conn = sqlite3.connect('file:flights.db?immutable=1', uri=True)
conn = sqlite3.connect('file:northwind.db?immutable=1', uri=True)
conn.row_factory = sqlite3.Row
@app.route('/')
async def index(request, sql=None):
sql = sql or request.args.get('sql', '')
if not sql:
sql = 'select * from sqlite_master'
rows = conn.execute(sql)
headers = [r[0] for r in rows.description]
return jinja.render('index.html', request,
headers=headers,
rows=list(rows),
)
@app.route('/<table:[a-zA-Z0-9].*>.json')
async def table_json(request, table):
sql = 'select * from {} limit 20'.format(table)
return response.json([
dict(r) for r in conn.execute(sql)
])
@app.route('/<table:[a-zA-Z0-9].*>')
async def table(request, table):
sql = 'select * from {} limit 20'.format(table)
return await index(request, sql)
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8006)

2
requirements.txt 100644
Wyświetl plik

@ -0,0 +1,2 @@
sanic==0.6.0
sanic-jinja2==0.5.5

Wyświetl plik

@ -0,0 +1,20 @@
<style>
td {
white-space: pre;
vertical-align: top;
border-top: 1px solid #666;
padding: 2px 4px;
}
</style>
<table>
<tr>
{% for header in headers %}<th scope="col">{{ header }}</th>{% endfor %}
</tr>
{% for row in rows %}
<tr>
{% for td in row %}
<td>{{ td }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>