Start by deciding which Python job you are hiring for, because the title covers very different work. A backend developer builds and runs APIs, a data engineer moves data between systems, and an automation developer writes scripts and internal tools. Once you know it is backend work, pick the framework the project needs, then test the developer on the parts of production Python that tutorials skip: the ORM, async code, background jobs, tests and deployment.
This guide covers the backend and API role in Django, Flask and FastAPI: how to choose between them, the skills to check, ten questions to ask, the monthly cost by region and the warning signs. Our process and terms are on the hire Python developers page.
The short answer
- Name the job first: backend and APIs, data pipelines, or scripts and automation. Each needs a different interview.
- Let the project pick the framework: Django for users, roles and an admin; Flask for a lean service; FastAPI for typed, async APIs.
- Check seven production skills: type hints, async, an ORM, pytest, background jobs, dependency management and deployment.
- Interview on real problems: a slow endpoint, a blocking call in async code, a migration on a large table.
- Compare the full monthly cost, with employer costs and hiring time included.
- Keep the repository, cloud accounts and secrets in your company's name, and start with a trial on a real ticket.
Which Python developer do you need?
Python job titles blur three kinds of work. Decide which one will fill most of the developer's week.
- Backend and API developer. Builds the server side of a product: endpoints, database models, sign-in and permissions, payments, integrations and background jobs, then deploys and monitors them in Django, Flask or FastAPI.
- Data engineer. Moves and reshapes data with SQL, Pandas and scheduled jobs in Airflow, loading a warehouse such as BigQuery or Snowflake. Machine learning roles sit next to this one, with their own tools and interview.
- Automation developer. Writes internal tools, scrapers, report generators and glue between SaaS products.
This guide is about the first role, the focus of Empiric Infotech's Python work. A good backend developer also handles a nightly import or a scraper, built as a service with retries, logging and tests.
MarketPlace Monitor, an e-commerce SaaS product for a UK client, shows the mix. Its Python backend is a real-time engine that monitors searches across several marketplaces, handles high-volume scraping and sends instant push alerts to the app. A four-person team built the cross-platform app and its Python backend, and it has been live since June 2024 with regular updates.
Pick the framework before you hire
If you already run a Python codebase, the framework is decided: hire for it. For a new project, start from the shape of the product.
| The project | Start with |
|---|---|
| Users, roles, an admin, many models | Django |
| A focused service, a few endpoints | Flask |
| An API first, many consumers | FastAPI |
Django: the full product
Django ships with an ORM, migrations, authentication, permissions and an admin interface built from your models. Add Django REST Framework and it serves the API for a web or mobile app too. Rule of thumb: if you would otherwise build an admin panel by hand, choose Django. Our hire Django developers page covers that work.
Flask: small and explicit
Flask handles routing, requests and templates, and leaves the rest to you: SQLAlchemy for the database, Alembic for migrations and an extension for sign-in. A small service stays easy to read, and a growing one needs structure early, with blueprints and an application factory. Rule of thumb: Flask for a service with a handful of endpoints, or to extend a Flask app you already run. See hire Flask developers.
FastAPI: typed, async APIs
FastAPI builds the API from Python type hints. Pydantic models validate incoming data and shape each response, and the framework generates an OpenAPI schema and interactive docs from the same code. It runs on an ASGI server such as Uvicorn, which suits APIs that mostly wait on databases and other services. Rule of thumb: FastAPI for an API-first service with a separate frontend or several consumers.
Teams often run Django for the core product with one FastAPI service beside it. For more on the first two, read our post on web development with Django and Flask.
What a FastAPI developer should know
FastAPI is quick to learn, so experience shows in the details. When you hire FastAPI developers, check for these:
- Separate input and output schemas in Pydantic, so fields such as password hashes never appear in a response.
- Dependencies with
Dependsfor the database session, the current user and permission checks, which tests can swap for fakes. - Async without blocking. A blocking call inside
async def, such as therequestslibrary, stalls every request on that worker. The fix is an async client like httpx, or a plaindefendpoint, which FastAPI runs in a thread pool. - A database layer they bring. FastAPI has no ORM of its own, so the developer adds SQLAlchemy or SQLModel, Alembic and one session per request.
- Durable background work.
BackgroundTasksrun in the same process after the response, so anything that must survive a restart goes to Celery or a similar queue. - The schema as a contract, versioned, reviewed in pull requests and used to generate the frontend's API client.
Seven skills every Python backend needs
Whatever the framework, ask for an example of each from their last project.
- Type hints on functions and data models, checked by mypy or pyright in CI.
- Async: how the event loop works, when it helps (many network calls at once) and when it does not (CPU-heavy work, which belongs in worker processes).
- An ORM and the SQL under it: the Django ORM or SQLAlchemy, N+1 queries found and fixed, indexes chosen from real queries, transactions, and migrations that are safe on large tables.
- Testing with pytest: fixtures, factories for test data, parametrized cases and mocks for external APIs, run on every pull request.
- Background jobs: Celery with Redis or RabbitMQ, or a lighter queue such as RQ or Dramatiq, with retries, idempotent tasks and scheduled runs.
- Packaging and dependencies: a virtual environment,
pyproject.tomland a lock file from Poetry, uv or pip-tools, so CI and production install the same versions. - Deployment: a Docker image, Gunicorn for Django and Flask or Uvicorn for FastAPI, settings from environment variables, migrations as a release step, and error tracking such as Sentry.
10 questions that reveal real experience
Run these with one of your engineers listening. After each is what an experienced developer tends to cover.
- For this project, would you use Django, Flask or FastAPI? A choice tied to your product, plus what they would add, such as an ORM for FastAPI.
- An endpoint that lists orders takes four seconds. Where do you start? Count the queries. Fix N+1 queries with
select_relatedandprefetch_relatedin Django, orjoinedloadandselectinloadin SQLAlchemy, then check indexes withEXPLAIN, then paginate, and cache last. - What happens if you call a blocking library inside an
async defendpoint? The event loop stalls and every request on that worker waits. The fix is an async client, a plaindefendpoint or a queue. - A sign-up must send a welcome email and update the CRM. Where does that run? In a background job queued after the transaction commits (
transaction.on_commitin Django), idempotent so a retry never sends two emails. - How do you rename a column on a table with millions of rows without downtime? In steps: add the new column, write to both, backfill in batches, switch reads, and drop the old column later.
- How do you test code that calls Stripe? Mocks at the HTTP boundary with responses or respx, webhook handlers tested with recorded payloads, and no live calls in the unit suite.
- How do you pin and update dependencies? A committed lock file, the same install in CI and the Docker image, and scheduled updates through Dependabot or Renovate, gated by the tests.
- Walk me through deploying this service. An image built in CI, migrations before the new code takes traffic, a health check, error tracking and a tested rollback.
- Where do type hints pay off? Function signatures, data models and API schemas, checked in CI and added step by step to older code.
- You take over a Flask app with no tests. What happens first? Get it running, read the routes and models, pin the dependencies, set up CI and write tests around the riskiest paths before changing them.
What a Python developer costs per month
The framework barely moves the price. Who employs the developer, and where, moves it a lot.
Employing a developer yourself
- US: the median software developer earns $135,980 a year, which is $11,332 a month (BLS, May 2025), or about $15,298 a month with employer costs. The BLS publishes no separate band for Python or any framework, so treat this as the baseline for an experienced backend engineer.
- UK and EU: about EUR 7,875 a month with employer costs.
- Australia: about AUD $13,455 a month with employer costs.
Employer costs come from our software development cost benchmark. Hiring adds about six weeks to fill a role and about $5,475 per hire in the US (SHRM 2025).
Paying an agency, junior to senior, per month at 160 hours (Accelerance 2026):
- Asia: $3,840 to $6,560.
- Eastern Europe: $4,960 to $12,160.
- Latin America: $5,280 to $12,000.
A dedicated developer from Empiric Infotech, 2026 rate: $2,000 (EUR 2,000, AUD $3,000) for 160 to 172 hours, working only on your product. A senior team lead reviews and tests every release, so there is no separate QA seat. For the full regional comparison, see dedicated developer cost per month.
Warning signs in a Python hire
- SQL built with f-strings or string concatenation, an open door to SQL injection.
async defon every endpoint, with therequestslibrary called inside.- Emails, imports and reports run inside the web request.
- No lock file, or packages installed by hand on the server.
- Secrets in the repository, or
DEBUGleft on in production. - Every framework question answered with the one framework they know.
- A wish to host your code in their own repository or cloud account.
Before the first commit
The first two weeks tell you whether the hire works. Set these up at the start:
- A trial on a real ticket, such as a new endpoint with tests, judged on the pull request and the questions asked. Empiric Infotech starts every engagement with a 7-day risk-free trial, and you can stop later with seven days' notice.
- Accounts in your company's name: the repository, the cloud account, the database and the error tracker. You own the code, the repository and the accounts.
- Paperwork before access: an NDA and an IP assignment from day 0. US clients get a W-8BEN-E, and UK and EU clients sign a DPA with Standard Contractual Clauses.
- Secrets in a secret manager, never pasted into chat.
- Meet the developer first. Each developer Empiric Infotech introduces is mid to senior level and has cleared technical interviews, real-world coding tests and a portfolio review. You interview them before they start, and a project manager joins your meetings.
Frequently asked questions
Should we hire a Django developer or a FastAPI developer?
Hire for the framework your code already uses. For a new product, Django suits one with users, roles and an admin, and FastAPI suits a typed API with a separate frontend. Empiric Infotech's Python developers work in both and choose per service.
Is Python fast enough for a production API?
Yes, for most web products. Request time goes mainly to database queries and calls to other services, which async code, caching and worker processes handle. When one path is CPU-heavy, the developer profiles it and moves only that path to a worker.
How many hours does a Python developer in India overlap with a UK team?
5 to 7 hours a day: 9:00 AM to 3:00 PM in the UK and 9:00 AM to 4:00 PM in Central Europe. That covers a standup, API design sessions, code review and live debugging.
Do we need a frontend developer as well?
Usually, once customers use the product through a web app. The Python developer serves the API, and a React developer builds the screens against the same OpenAPI schema. For internal tools, the Django admin often covers the interface.
How quickly can a Python developer start?
Within 48 hours of your go-ahead, after you have met the developer Empiric Infotech introduces. An in-house hire in the US takes about six weeks to fill.
Who owns the code and the cloud accounts?
You do, fully. The NDA and IP assignment are signed from day 0, and the developer commits to your repository and deploys to your cloud account, so everything they build stays with your company.
Bring two notes to the first call
Two notes are enough to start: which of the three Python jobs you are filling, and which framework the project runs on. Bring both, and we introduce a developer whose recent work matches. The hire Python developers page has our process, the trial and the terms for the US, Europe and Australia, and the Django and Flask pages cover work centred on one framework.









