Realistic test assignment for Junior Python developer | FastAPI + GraphQL

Posted by


In this tutorial, we will walk through a real test task for a Junior Python developer focusing on FastAPI and GraphQL. FastAPI is a modern, fast web framework for building APIs with Python 3.6+ based on standard Python type hints. GraphQL is a query language for your API and a runtime for executing those queries by using a type system that you define for your data.

The test task we will cover involves creating a simple CRUD API using FastAPI and GraphQL. The task includes the following requirements:

  1. Create a user model with the following fields: id, name, email.
  2. Implement CRUD operations for the user model using GraphQL.
  3. Users should be able to query all users, query a specific user by id, create a new user, update an existing user, and delete a user.

Let’s start by setting up our project and installing the necessary dependencies. We will need to install FastAPI, graphene, and uvicorn.

pip install fastapi graphene uvicorn

Next, let’s create a new Python file for our project, for example, app.py. We will start by importing the necessary modules and creating the user model.

from typing import List
from fastapi import FastAPI
from pydantic import BaseModel
from graphene import ObjectType, String, ID, List as GrapheneList, Field
from fastapi_graphql import GraphQLApp

app = FastAPI()

class User(BaseModel):
    id: int
    name: str
    email: str

users = []

Next, we will define the GraphQL schema for our API. We will create a User schema with queries and mutations for CRUD operations.

class UserSchema(ObjectType):
    id = ID()
    name = String()
    email = String()

class Query(ObjectType):
    users = GrapheneList(UserSchema)

    def resolve_users(self, info):
        return users

class CreateUser(ObjectType):
    user = Field(UserSchema)

class CreateUserInput(BaseModel):
    name: str
    email: str

class CreateMutation(ObjectType):
    create_user = Field(CreateUser, input=CreateUserInput)

    def resolve_create_user(self, info, input):
        new_user = User(id=len(users) + 1, name=input.name, email=input.email)
        users.append(new_user)
        return CreateUser(user=new_user)

class UpdateUser(ObjectType):
    user = Field(UserSchema)

class UpdateUserInput(BaseModel):
    id: int
    name: str
    email: str

class UpdateMutation(ObjectType):
    update_user = Field(UpdateUser, input=UpdateUserInput)

    def resolve_update_user(self, info, input):
        user = next((user for user in users if user.id == input.id), None)
        if user:
            user.name = input.name
            user.email = input.email
        return UpdateUser(user=user)

class DeleteUser(ObjectType):
    success = String()

class DeleteUserInput(BaseModel):
    id: int

class DeleteMutation(ObjectType):
    delete_user = Field(DeleteUser, input=DeleteUserInput)

    def resolve_delete_user(self, info, input):
        user = next((user for user in users if user.id == input.id), None)
        if user:
            users.remove(user)
            return DeleteUser(success="User deleted successfully")
        return DeleteUser(success="User not found")

Lastly, we will create the main function that will create the FastAPI app and add the GraphQL endpoint to it.

if __name__ == "__main__":
    app.add_route("/graphql", GraphQLApp(schema=Schema(query=Query, mutation=Mutation)))
    uvicorn.run(app, host="0.0.0.0", port=8000)

Now, we can run our API by executing the following command in the terminal:

uvicorn app:app --reload

You can now test your API using a tool like Postman or GraphQL Playground. Here are some example queries you can try:

# Query all users
{
  users {
    id
    name
    email
  }
}

# Query a specific user by id
{
  user(id: 1) {
    id
    name
    email
  }
}

# Create a new user
mutation {
  createUser(input: {name: "John Doe", email: "johndoe@example.com"}) {
    user {
      id
      name
      email
    }
  }
}

# Update an existing user
mutation {
  updateUser(input: {id: 1, name: "Jane Doe", email: "janedoe@example.com"}) {
    user {
      id
      name
      email
    }
  }
}

# Delete a user
mutation {
  deleteUser(input: {id: 1}) {
    success
  }
}

Congratulations! You have successfully completed the test task for a Junior Python developer focusing on FastAPI and GraphQL. Feel free to explore more features of FastAPI and GraphQL to enhance your API further. Happy coding!

0 0 votes
Article Rating

Leave a Reply

27 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
@viachezavad
19 days ago

Привет!
что используешь чтобы стразу сделать импорт нужно библиотеки?

@nikolazzzer7087
19 days ago

Это тестовое не для новичков ! это уровень минимум мидл! Джунам не платят 100к !

@vatasi7312
19 days ago

Вот это я понимаю тестовое задание на 4 часа работы. Мне по фронту приходят такие , что приходится тратить неделю. Верстка полноценной страницы, с акардеонами и тп. С 3 брейкпоинтами. Запросы на сервер, работа с глобальным стейтом😂😂😂 , вообщем фронт работодатели, охерели в конец притом зп 40 50

@ИсаАгакишиев
19 days ago

Проблема в том что доставщик так же зарабатывает.

@MikJagger1982
19 days ago

СПАСИБО. БЫЛО ИНТЕРЕСНО.

@Lokamp_
19 days ago

Хорошо бы увидеть финал. Ответ и работодателя, может быть какие нибуь комментарии с их стороны и тд, а так пока видео неполноценное получается в итоге.

@ddsdp6654
19 days ago

Классное видео с разбором реальной тестовой задачи, но что то это тянет на проверку мидла, а не джуниора.

@Алекс-ц5к
19 days ago

Курьеры больше получают

@soonzins
19 days ago

21:30 <3

@АндрейКоченко-е9ц
19 days ago

Крутой формат! спасибо большое !

@kekulusskek
19 days ago

Прибижай, пожалуйста, окно с кодом. С телефона не очень удобно читать, из-за разницы в разрешении.

@SuperWolchara
19 days ago

можно воспользоваться лайфхаком и в основном тексе запроса написать where 1 = 1 тогда и проверять не нужно наличие условий просто наращивай условия и все. В MS SQL использование in() иногда тормозит запрос фиксится это (… or … or … or) не знаю как в постгресе обстоят дела

@m8h4mm4d
19 days ago

Молодец, без музыки, без лишняков, все по делу без воды!
like + subscribe

@ioannp.5274
19 days ago

Игорь, а можете еще объяснить gunicorn vs uvicorn, я думал, что там разница только в том, что uvicorn это асинхронный веб-сервер, а gunicorn – синхронный, соответственно запустить на гуникорне асинхронный FastAPI проект просто не получится?

@user-dh7pj1hc1z
19 days ago

Жесть сколько же на джуна надо знать!я только второй курс на степике прохожу поколение пайтон.Стек технологий огромный ппц сколько у меня времени на всё уйдёт

@NoName-tb1uj
19 days ago

Хорошее видео!) Можешь сделать вебку немного меньше и ниже, а то иногда не было видно ответы с сервера. А почему квери нужно писать на сыром SQL? Я учу DjangoORM сейчас и там для этого существуют разные методы get_or_create и тд… Заранее спасибо за ответ.

@vog25
19 days ago

Что за тема в Пайчарме?

@vasiliy2396
19 days ago

на ref table индекс автоматом создаётся

@davidnaneishvili
19 days ago

Получилось очень полезно, спасибо!

@ВячаФродо
19 days ago

Отличный формат. Почему решил не использовать алхимию?

27
0
Would love your thoughts, please comment.x
()
x