No hay ningún ejemplo para aiohttp en el mundo real , y decidí hacer uno. Parece que los desarrolladores experimentados no tienen tiempo para hacer esto, y los principiantes en aiohttp no entienden cómo hacerlo correctamente. Empecé a hacerlo con Tortoise ORM. Al comenzar a hacer la autenticación.
Quiero hacer que este proyecto sea correcto, por lo que hay muchas preguntas para los desarrolladores de aiohttp con experiencia bajo el corte.
Proyecto de instalacion
Repositorio
Clonar el repositorio:
git clone git@github.com: nomhoi / aiohttp-realworld-example-app.git
En desarrollo, usé Python 3.8. Instalar las dependencias:
pip install -r required.txt
Inicialice la base de datos:
python init_db.py
Iniciamos el servidor:
python -m conducto
En el repositorio hay una colección Postman RealWorld.postman_collection.json . Importarlo en Postman y puede probar la API resultante.
PostgreSQL
Por defecto, se utiliza la base de datos SQLite.
Para usar PostrgeSQL, debe cambiar la variable DB_URL en /conduit/settings.py.
DB_URL = "postgres: // postgres: postgres@0.0.0.0: 5432 / postgres"
Inicie el servicio de base de datos:
docker-compose up -d
Después de eso, inicialice la base de datos:
python init_db.py
Estructura del archivo del proyecto
Django: . .
, , RealWorld Django.
— conduit.
API
API
POST /api/users —
POST /api/users/login —
GET /api/user —
/authentication/views.py.
CORS
aiohttp_cors.
cors = aiohttp_cors.setup(app, defaults={
"*": aiohttp_cors.ResourceOptions(
allow_credentials=True,
expose_headers="*",
allow_headers="*",
)
})
for route in list(app.router.routes()):
cors.add(route)
, , .
, .
JWT
aiohttp_jwt:
app = web.Application(
middlewares=[
JWTMiddleware(
settings.SECRET_KEY,
whitelist=[
r'/api/users',
]
)
]
)
JWT , Authorization Token Bearer. Django — Token. .
User
Tortoise ORM
class TimestampedMixin:
created_at = fields.DatetimeField(auto_now_add=True)
updated_at = fields.DatetimeField(auto_now=True)
class AbstractBaseModel(Model):
id = fields.IntField(pk=True)
class Meta:
abstract = True
class User(TimestampedMixin, AbstractBaseModel):
username = fields.CharField(db_index=True, max_length=255, unique=True)
email = fields.CharField(db_index=True, max_length=255, unique=True)
password = fields.CharField(max_length=128)
class Meta:
table = "user"
def __str__(self):
return self.username
, Django :
ordering = ['-created_at', '-updated_at']
, User. .
Django: + PBKDF2. .
Tortoise ORM . , .
Hasta ahora, hecho sin serializadores. Encontré un proyecto así , pero hay una versión antigua de Tortoise ORM.
Hay otras implementaciones de serializadores. Probablemente, con ellos el desarrollo es idiomático y más rápido. Necesitas intentar. ORM enganchado, ahora necesitamos agregar serializadores. ¿O tal vez agregar más renders?
Pruebas
Aún no agregado. Según las condiciones de la tarea, se pueden realizar pruebas, pero no son necesarias.
Conclusión
También necesita agregar soporte para perfiles, artículos y mucho más. Todos están invitados al proyecto para glorificar su nombre durante siglos y milenios. Sugerencias y comentarios de desarrolladores experimentados son bienvenidos.