Skip to content

Commit a4274d5

Browse files
authored
Merge pull request #13 from jowilf/update-examples
Update examples
2 parents cf1ef2f + 0f7e021 commit a4274d5

File tree

4 files changed

+126
-128
lines changed

4 files changed

+126
-128
lines changed

examples/fastapi/app.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from sqlalchemy import Column
1717
from sqlalchemy_file import File, ImageField
1818
from sqlalchemy_file.exceptions import ValidationError
19-
from sqlalchemy_file.processors import ThumbnailGenerator
2019
from sqlalchemy_file.storage import StorageManager
2120
from sqlalchemy_file.validators import SizeValidator
2221
from sqlmodel import Field, Session, SQLModel, create_engine, select
@@ -69,8 +68,8 @@ class Category(CategoryBase, table=True):
6968
sa_column=Column(
7069
ImageField(
7170
upload_storage="category",
71+
thumbnail_size=(200, 200),
7272
validators=[SizeValidator(max_size="1M")],
73-
processors=[ThumbnailGenerator(thumbnail_size=(200, 200))],
7473
)
7574
)
7675
)

examples/flask/__init__.py

Lines changed: 0 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +0,0 @@
1-
import os
2-
3-
from flask import Flask, abort, render_template, request, send_file
4-
from flask_sqlalchemy import SQLAlchemy
5-
from libcloud.storage.drivers.local import LocalStorageDriver
6-
from libcloud.storage.providers import get_driver
7-
from libcloud.storage.types import (
8-
ContainerAlreadyExistsError,
9-
ObjectDoesNotExistError,
10-
Provider,
11-
)
12-
from sqlalchemy_file import FileField, ImageField
13-
from sqlalchemy_file.exceptions import ValidationError
14-
from sqlalchemy_file.processors import ThumbnailGenerator
15-
from sqlalchemy_file.storage import StorageManager
16-
from sqlalchemy_file.validators import ContentTypeValidator, SizeValidator
17-
18-
app = Flask(__name__)
19-
app.config[
20-
"SQLALCHEMY_DATABASE_URI"
21-
] = "sqlite:////tmp/example.db?check_same_thread=False"
22-
db = SQLAlchemy(app, engine_options={"echo": True})
23-
24-
25-
class Book(db.Model):
26-
__tablename__ = "books"
27-
isbn = db.Column(db.Integer, primary_key=True)
28-
author = db.Column(db.String(100), nullable=False)
29-
title = db.Column(db.String(100), nullable=False)
30-
cover = db.Column(
31-
ImageField(
32-
upload_storage="images",
33-
validators=[SizeValidator("16M")],
34-
processors=[ThumbnailGenerator((50, 50))],
35-
)
36-
)
37-
document = db.Column(
38-
FileField(
39-
upload_storage="documents",
40-
validators=[
41-
SizeValidator("5M"),
42-
ContentTypeValidator(
43-
allowed_content_types=[
44-
"application/pdf",
45-
"application/msword",
46-
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
47-
]
48-
),
49-
],
50-
)
51-
)
52-
53-
54-
@app.route("/", methods=("GET", "POST"))
55-
def index():
56-
error = None
57-
if request.method == "POST":
58-
try:
59-
book = Book(
60-
author=request.form["author"],
61-
title=request.form["title"],
62-
)
63-
if "cover" in request.files and request.files["cover"].filename != "":
64-
book.cover = request.files["cover"]
65-
if "document" in request.files and request.files["document"].filename != "":
66-
book.document = request.files["document"]
67-
db.session.add(book)
68-
db.session.commit()
69-
except ValidationError as err:
70-
error = err
71-
db.session.rollback()
72-
return render_template(
73-
"index.html", books=Book.query.all(), form=request.form, error=error
74-
)
75-
76-
77-
@app.route("/medias/<storage>/<file_id>")
78-
def serve_files(storage, file_id):
79-
try:
80-
file = StorageManager.get_file(f"{storage}/{file_id}")
81-
if isinstance(file.object.driver, LocalStorageDriver):
82-
"""If file is stored in local storage, just return a
83-
FileResponse with the fill full path."""
84-
return send_file(
85-
file.get_cdn_url(),
86-
mimetype=file.content_type,
87-
download_name=file.filename,
88-
)
89-
elif file.get_cdn_url() is not None:
90-
"""If file has public url, redirect to this url"""
91-
return app.redirect(file.get_cdn_url())
92-
else:
93-
"""Otherwise, return a streaming response"""
94-
return app.response_class(
95-
file.object.as_stream(),
96-
mimetype=file.content_type,
97-
headers={"Content-Disposition": f"attachment;filename={file.filename}"},
98-
)
99-
except ObjectDoesNotExistError:
100-
abort(404)
101-
102-
103-
if __name__ == "__main__":
104-
os.makedirs("/tmp/storage", 0o777, exist_ok=True)
105-
driver = get_driver(Provider.LOCAL)("/tmp/storage")
106-
107-
# cls = get_driver(Provider.MINIO)
108-
# driver = cls("minioadmin", "minioadmin", secure=False, host="127.0.0.1", port=9000)
109-
110-
try:
111-
driver.create_container(container_name="images")
112-
except ContainerAlreadyExistsError:
113-
pass
114-
try:
115-
driver.create_container(container_name="documents")
116-
except ContainerAlreadyExistsError:
117-
pass
118-
119-
StorageManager.add_storage("images", driver.get_container(container_name="images"))
120-
StorageManager.add_storage(
121-
"documents", driver.get_container(container_name="documents")
122-
)
123-
124-
db.create_all()
125-
app.run(debug=True)

examples/flask/app.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import os
2+
3+
from flask import Flask, abort, render_template, request, send_file
4+
from flask_sqlalchemy import SQLAlchemy
5+
from libcloud.storage.drivers.local import LocalStorageDriver
6+
from libcloud.storage.providers import get_driver
7+
from libcloud.storage.types import (
8+
ContainerAlreadyExistsError,
9+
ObjectDoesNotExistError,
10+
Provider,
11+
)
12+
from sqlalchemy_file import FileField, ImageField
13+
from sqlalchemy_file.exceptions import ValidationError
14+
from sqlalchemy_file.storage import StorageManager
15+
from sqlalchemy_file.validators import ContentTypeValidator, SizeValidator
16+
17+
app = Flask(__name__)
18+
app.config[
19+
"SQLALCHEMY_DATABASE_URI"
20+
] = "sqlite:////tmp/example.db?check_same_thread=False"
21+
db = SQLAlchemy(app, engine_options={"echo": True})
22+
23+
24+
class Book(db.Model):
25+
__tablename__ = "books"
26+
isbn = db.Column(db.Integer, primary_key=True)
27+
author = db.Column(db.String(100), nullable=False)
28+
title = db.Column(db.String(100), nullable=False)
29+
cover = db.Column(
30+
ImageField(
31+
upload_storage="images",
32+
thumbnail_size=(50, 50),
33+
validators=[SizeValidator("16M")],
34+
)
35+
)
36+
document = db.Column(
37+
FileField(
38+
upload_storage="documents",
39+
validators=[
40+
SizeValidator("5M"),
41+
ContentTypeValidator(
42+
allowed_content_types=[
43+
"application/pdf",
44+
"application/msword",
45+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
46+
]
47+
),
48+
],
49+
)
50+
)
51+
52+
53+
@app.route("/", methods=("GET", "POST"))
54+
def index():
55+
error = None
56+
if request.method == "POST":
57+
try:
58+
book = Book(
59+
author=request.form["author"],
60+
title=request.form["title"],
61+
)
62+
if "cover" in request.files and request.files["cover"].filename != "":
63+
book.cover = request.files["cover"]
64+
if "document" in request.files and request.files["document"].filename != "":
65+
book.document = request.files["document"]
66+
db.session.add(book)
67+
db.session.commit()
68+
except ValidationError as err:
69+
error = err
70+
db.session.rollback()
71+
return render_template(
72+
"index.html", books=Book.query.all(), form=request.form, error=error
73+
)
74+
75+
76+
@app.route("/medias/<storage>/<file_id>")
77+
def serve_files(storage, file_id):
78+
try:
79+
file = StorageManager.get_file(f"{storage}/{file_id}")
80+
if isinstance(file.object.driver, LocalStorageDriver):
81+
"""If file is stored in local storage, just return a
82+
FileResponse with the fill full path."""
83+
return send_file(
84+
file.get_cdn_url(),
85+
mimetype=file.content_type,
86+
download_name=file.filename,
87+
)
88+
elif file.get_cdn_url() is not None:
89+
"""If file has public url, redirect to this url"""
90+
return app.redirect(file.get_cdn_url())
91+
else:
92+
"""Otherwise, return a streaming response"""
93+
return app.response_class(
94+
file.object.as_stream(),
95+
mimetype=file.content_type,
96+
headers={"Content-Disposition": f"attachment;filename={file.filename}"},
97+
)
98+
except ObjectDoesNotExistError:
99+
abort(404)
100+
101+
102+
if __name__ == "__main__":
103+
os.makedirs("/tmp/storage", 0o777, exist_ok=True)
104+
driver = get_driver(Provider.LOCAL)("/tmp/storage")
105+
106+
# cls = get_driver(Provider.MINIO)
107+
# driver = cls("minioadmin", "minioadmin", secure=False, host="127.0.0.1", port=9000)
108+
109+
try:
110+
driver.create_container(container_name="images")
111+
except ContainerAlreadyExistsError:
112+
pass
113+
try:
114+
driver.create_container(container_name="documents")
115+
except ContainerAlreadyExistsError:
116+
pass
117+
118+
StorageManager.add_storage("images", driver.get_container(container_name="images"))
119+
StorageManager.add_storage(
120+
"documents", driver.get_container(container_name="documents")
121+
)
122+
123+
db.create_all()
124+
app.run(debug=True)

mkdocs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ watch:
6969
extra:
7070
analytics:
7171
provider: google
72-
property: G-6GVDGPXNYF
72+
property: G-DX31D2F61K
7373
social:
7474
- icon: fontawesome/brands/github
7575
link: https://github.com/jowilf

0 commit comments

Comments
 (0)