identixone / fastapi_contrib Goto Github PK
View Code? Open in Web Editor NEWOpinionated set of utilities on top of FastAPI
Home Page: https://fastapi-contrib.readthedocs.io
License: MIT License
Opinionated set of utilities on top of FastAPI
Home Page: https://fastapi-contrib.readthedocs.io
License: MIT License
What are the things needed to be updated in order for contrib to work properly with the new fastapi version?
Currently we can only override settings with settings from the fastAPI app by using environment variables (See the Todo).
Can we implement this functionaility, so we do not have to go through the environment variables?
Describe what you were trying to get done.
Tell us what happened, what went wrong, and what you expected to happen.
As some of my model classes are big enough (~50-100) lines I wanted to divide models into files, one file for each MongoDBModel. The case is that these new models are not listed while create_index() is called, I even debugged the sources and it seems like fastapi_contrib cannot find those model classes anymore. Creating an init.py and importing those models there did not help as well.
Investigation shows that the fastapi_contrib.db.utils.get_models() is searching for a signle *.py file to contain all the models. What could be better is, in my opinion to alter a code a bit, so that the function get_models will look like the following:
from fastapi_contrib.db.models import MongoDBModel
import inspect
apps_folder_name = settings.apps_folder_name
models = []
for app in settings.apps:
app_path = f"{apps_folder_name}/{app}"
modules = [f for f in pkgutil.walk_packages(path=[app_path]) if f.name == 'models']
if not modules:
continue
for module in modules:
path_to_models = f"{apps_folder_name}.{app}.models"
mudule = importlib.import_module(path_to_models)
if module.ispkg:
module_models = [x[0] for x in inspect.getmembers(mudule, inspect.isclass)]
else:
try:
module_models = pyclbr.readmodule(path_to_models).keys()
except (AttributeError, ImportError):
logger.warning(
f"Unable to read module attributes in {path_to_models}"
)
continue
models.extend([getattr(mudule, model) for model in module_models])
Paste the command(s) you ran and the output.
If there was a crash, please include the traceback here.
Instance of child ModelSerializer have not own methods, only methods of Serializer or its parent.
class DeviceSerializer(ModelSerializer):
def bla(self):
return "bla"
class Meta:
model = Device
exclude = ()
Hi,
This library looks fantastic and I'm going to try and use it for the easy mongodb integration with FastAPI.
What I would be interested in (and may look to contribute myself) is a FirestoreClient (GCP's serverless document db) that could work as a drop in replacement for the mongodb client as I'm seeking to support both in a project i'm working on. I can see the intention of your design is to provide a nice abstraction to the DB technology, this use case would put that to the test with a second implementation.
pipenv.exceptions.ResolutionFailure: ERROR: ERROR: Could not find a version that matches fastapi==0.42.0,==0.45.0
Trying to use lib with FastAPI 0.45.0 and up
When trying to use List of generated response_model
model as response_model in route, you get in response
{
"code": 400,
"detail": "Validation error",
"fields": [
{
"name": "response",
"message": "Value is not a valid list"
}
]
}
from typing import List
from fastapi import APIRouter, Depends
from fastapi_contrib.pagination import Pagination
from fastapi_contrib.serializers import openapi
from fastapi_contrib.serializers.common import Serializer
@openapi.patch
class MySerializer(Serializer):
...
router = APIRouter()
@router.get("/", response_model=List[MySerializer.response_model])
async def lst(pagination: Pagination = Depends()):
return await pagination.paginate(MySerializer)
My model need output _id field to frontend of my project.
def dict(self, *args, **kwargs) -> dict:
"""
Removes excluded fields based on `Meta` and `kwargs`
:return: dict of serializer data fields
"""
exclude = kwargs.get("exclude")
if not exclude:
exclude = set()
**exclude.update({"_id"})**
if hasattr(self.Meta, "exclude") and self.Meta.exclude:
exclude.update(self.Meta.exclude)
if (
hasattr(self.Meta, "write_only_fields")
and self.Meta.write_only_fields
):
exclude.update(self.Meta.write_only_fields)
kwargs.update({"exclude": exclude})
original = super().dict(*args, **kwargs)
return original
Hello. I was looking for tools with what will be possible to play FastAPI with MongoDB in nice, simple way, because I never before using NoSQL. I found FastAPI_Contrib, my attention takes especially two of features:
ModelSerializers: serialize (pydantic) incoming request, connect data with DB model and save
MongoDB integration: Use models as if it was Django (based on pydantic models)
I was trying all day to understand the documentation how to use FastAPI_Contrib, unfortunately documentation is so hard for entry-level users. What I want to achieve at this time is nothing more than just:
Just a first step of CRUD...
I was trying take it in very different ways, but for this issue I will present the most simply way based on documentation...
Project Structure:
project/
- project/
-- sample/
--- __init__.py
--- serializers.py
- __init__.py
- main.py
project/main.py:
import os
from fastapi_contrib.db.utils import setup_mongodb, create_indexes
import motor.motor_asyncio
from fastapi import FastAPI
from dotenv import load_dotenv
from project.serializers import sample_router
load_dotenv(verbose=True)
DATABASE_URL =os.getenv("DB_URL")
SECRET = os.getenv("SECRET")
CONTRIB_APPS = os.getenv("CONTRIB_APPS")
CONTRIB_APPS_FOLDER_NAME = os.getenv("CONTRIB_APPS_FOLDER_NAME")
client = motor.motor_asyncio.AsyncIOMotorClient(
DATABASE_URL, uuidRepresentation="standard"
)
db = client["sample"]
app = FastAPI()
@app.on_event("startup")
async def startup():
setup_mongodb(db)
await create_indexes()
print('Is it connected to DB?')
app.include_router(sample_router)
project/sample/serializers.py
from fastapi import APIRouter
from fastapi_contrib.db.models import MongoDBModel
from fastapi_contrib.serializers import openapi
from fastapi_contrib.serializers.common import Serializer
# from yourapp.models import SomeModel
sample_router = APIRouter()
class SomeModel(MongoDBModel):
field1: str
class Meta:
collection = "test"
@openapi.patch
class SomeSerializer(Serializer):
read_only1: str = "const"
write_only2: int
not_visible: str = "42"
class Meta:
model = SomeModel
exclude = {"not_visible"}
write_only_fields = {"write_only2"}
read_only_fields = {"read_only1"}
@sample_router.post("/test/", response_model=SomeSerializer.response_model)
async def root(serializer: SomeSerializer):
model_instance = await serializer.save()
return model_instance.dict()
When I send data as POST to /test/ from postman
{
"write_only2": 2,
"field1": "string"
}
or by curl
curl -X POST "http://127.0.0.1:8000/test/" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"id\":0,\"field1\":\"string\",\"write_only2\":0}"
if I will remove:
class Meta:
collection = "test"
as it in an example in documentation then I got other error:
I will be grateful if someone will explain to me using simple examples how to properly combine models, serializers, and perform CRUD operations on them reflected in MongoDB.
By the way.
I think is it good idea to rewrite documentation to be more affordable to not so advenced users. And add to them a tutorial, awesome will be to see there real world examples. I think, good documentation can make this package a very popular.
Regards,
Oskar
What do you think about adding a changelog so users know what changes to expect from a version update?
The bot created this issue to inform you that pyup.io has been set up on this repo.
Once you have closed it, the bot will open pull requests for updates as soon as they are available.
Sample taken from: https://github.com/identixone/fastapi_contrib#usage
class CustomPagination(Pagination):
default_offset = 90
default_limit = 1
max_offset = 100`
max_limit = 2000
In the above code, notice there's one extra character after max_offset = 100
Paste the command(s) you ran and the output.
If there was a crash, please include the traceback here.
max_offset = 100`
^
SyntaxError: invalid syntax
has_required_permisions
method from BasePermission
class should be has_required_permissions
, is it a typo or is it a trick to bypass a naming conflict?
Reading https://github.com/identixone/fastapi_contrib/blob/master/fastapi_contrib/conf.py#L73 - you may find https://configurator.readthedocs.io/en/latest/ to be of interest.
In particular https://configurator.readthedocs.io/en/latest/patterns.html#global-configuration-object.
If you have any questions, please ping me on here :-)
Hi, I am having trouble to update a document.
My model:
class MyModel(MongoDBTimeStampedModel):
id: UUID
other: str
Usage:
MyModel.update_one(
{'id': UUID(id)},
update={
'$set': { 'other' : 'something'}
}
)
Is it a bug in passing kwargs
to await collection.update_one( filter_kwargs, kwargs, session=session )
should not it be await collection.update_one( filter_kwargs, **kwargs, session=session )
or am I getting something wrong?
Ref: Source code
Could you please provide any reference to your code?
Flatbuffers is the high performance serialization library from Google - https://google.github.io/flatbuffers/flatbuffers_guide_use_python.html
It has compatible libraries for java (android), javascript and python.
Is it possible for you to create functionality that happens automatically for each endpoint - that it accepts data in flatbuffers and gives response in flatbuffers if the request has Accept: application/x-flatbuffers
in it.
e.g. curl -D- -H "Accept: application/x-flatbuffers" http://localhost:7002
if the header is not present, then the endpoint works with default json
In order to use this library successfully as part of another system that is deployed via Docker Swarm, we need to support reading configuration variables from secrets file
Hi,
I am trying to get a list of entries from a collection sorted in descending order according to a recorded date (not a creation timestamp, I am not using the timestamped model). Pymongo sort should work passing a sort=[(key, value)] argument, but when I do that, I get back an empty list. Am I doing anything wrong?
This is my function. The field transmit_time is a MongoDB date field.
@router.get("/")
async def get_packets(limit: int = 100, offset: int = 0):
sort_desc = [('transmit_time', -1)]
packets = await Packet.list(_limit=limit, _offset=offset, sort=sort_desc)
return packets
I cloned fastapi project which uses fastapi-contrib library.
and then i installed fastapi-contrib with $ pip install fastapi_contrib
.
but ModuleNotFoundError: No module named 'fastapi_contrib' was logged repeatly. ๐
Thank you for your busy schedule. ๐๐ผ
$ pip install fastapi_contrib[all]
(but it says zsh: no matches found: fastapi_contrib[all]
)Hello guys I need help with testing PermissionsDependency.
My current code is :
api_router.include_router(
article_deviation.router,
prefix="{Confidential information}",
tags=["{confidential information}"],
dependencies=[
Depends(azure_scheme),
Depends(PermissionsDependency([QCPermission])),
],
)
In the test I override azure_scheme as :
api_client = TestClient(app)
app.dependency_overrides[azure_scheme] = {"Authorized": "Yes"}
but with
api_client = TestClient(app)
app.dependency_overrides[PermissionsDependency([QCPermission])] = True
It does not work.
Thank you in advance! Wish you all best!
Hello, is this package still mantained?
Decide whether we need $set or $push based on field type and positional arguments criteria.
There is potential room for separate primitives module as part of $or, $ne and others. Discussion is appreciated.
Currently fastapi/pydantic versions are fixed in setup.py
:
requirements = [
'fastapi==0.52.0',
'pydantic==1.4',
'contextvars;python_version<"3.7"'
]
Is there a reason not to use >=
instead?
If compatibility is a concern, it's possible to test against different versions of FastAPI on TravisCI.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.