Разработка веб-ресурсов с помощью Python: от простых решений до сложных систем
Введение
Python предоставляет несколько мощных инструментов для веб-разработки. Выбор фреймворка зависит от задач: Django для крупных проектов, Flask для простых решений, FastAPI для высокопроизводительных API, а статические генераторы для документации и блогов. Ниже рассматриваются основные варианты.
Как создать полнофункциональный веб-сайт на Python с админпанелью?
Наиболее эффективным решением для полноценного веб-сайта является фреймворк Django. Он включает ORM, админпанель, систему маршрутизации и шаблонов. Установка выполняется через pip:
pip install djangoсоздание сайтов python django (создание веб-сайтов на django с использованием python)
Создание проекта:
django-admin startproject mysite
cd mysite
python manage.py startapp mainPython web django (web-фреймворк django)
Добавление приложения в settings.py. Создание модели в models.py:
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.titlePython web flask (web-фреймворк flask)
Миграции и создание суперпользователя:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuserPython web server (web-сервер на python)
Регистрация модели в admin.py:
from django.contrib import admin
from .models import Article
admin.site.register(Article)Python 3 веб приложение (веб-приложение на python 3)
Создание view в views.py для отображения статей:
from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, 'main/article_list.html', {'articles': articles})Python веб сервисы (веб-сервисы на python)
URLconf и шаблон. Типичные ошибки: забыть добавить приложение в INSTALLED_APPS, не выполнить миграции, проблемы со статическими файлами.
Проблема: статические файлы не отображаются в production. Решение: настроить STATIC_ROOT и использовать collectstatic.
Как сделать легковесный сайт на Flask?
Flask подходит для небольших проектов и API. Установка:
pip install flaskпримеры python веб (примеры веб-разработки на python)
Минимальное приложение:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Привет, мир!'
if __name__ == '__main__':
app.run()создание сайта на python (создание сайта на python)
Для шаблонов используется Jinja2. Создание папки templates и файла index.html. Типичная ошибка: не указать template_folder. Проблема с отладкой: не включен debug.
Проблема: импорт шаблонов не работает. Решение: убедиться, что папка templates находится внутри приложения.
Как разработать асинхронное API на FastAPI?
FastAPI обеспечивает высокую производительность и автоматическую документацию. Установка:
pip install fastapi uvicornDjango python создание приложения (создание веб-приложения на django)
Пример GET-эндпоинта:
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def read_root():
return {'Hello': 'World'}библиотека django python (библиотека django для веб-разработки на python)
Запуск: uvicorn main:app --reload. Документация доступна по /docs. Типичная ошибка: не установлен uvicorn, забыть указать reload.
Проблема: ошибка импорта Pydantic. Решение: установить pydantic отдельно (если не установлен).
Как создать статический сайт из Markdown с Pelican?
Pelican генерирует статические HTML-файлы из Markdown или reStructuredText. Установка:
pip install pelican markdownИнициализация проекта: pelican-quickstart. Создание статьи в папке content. Команда для генерации: pelican content. Типичная ошибка: неправильный формат имени файла (должен содержать дату). Проблема: не отображаются изображения. Решение: настроить STATIC_PATHS.
Проблема: отсутствие темы по умолчанию. Решение: скачать тему или использовать встроенную notmyidea.
Расширенные примеры кода
Django: Class-Based View с пагинацией и формой поиска
Создадим список статей с постраничной навигацией и формой поиска.
# views.py
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'main/article_list.html'
context_object_name = 'articles'
paginate_by = 5
def get_queryset(self):
queryset = super().get_queryset()
q = self.request.GET.get('q')
if q:
queryset = queryset.filter(title__icontains=q)
return querysetПри GET-запросе /articles/?q=python вернет статьи, содержащие 'python' в заголовке. Пагинация доступна как page_obj.
Шаблон (фрагмент):
<form method="get">
<input type="text" name="q">
<button type="submit">Поиск</button>
</form>
{% for article in articles %}
<h3>{{ article.title }}</h3>
{% endfor %}
<div class="pagination">
<span>{% if page_obj.has_previous %}...{% endif %}</span>
</div>Flask: Приложение с базой данных SQLAlchemy и формами WTForms
Настройка Flask с расширениями.
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SECRET_KEY'] = 'secret'
db = SQLAlchemy(app)
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
class ArticleForm(FlaskForm):
title = StringField('Заголовок', validators=[DataRequired()])
content = TextAreaField('Содержание', validators=[DataRequired()])
submit = SubmitField('Сохранить')
@app.route('/', methods=['GET', 'POST'])
def index():
form = ArticleForm()
if form.validate_on_submit():
article = Article(title=form.title.data, content=form.content.data)
db.session.add(article)
db.session.commit()
return redirect('/')
articles = Article.query.all()
return render_template('index.html', form=form, articles=articles)
if __name__ == '__main__':
db.create_all()
app.run(debug=True)После запуска на главной странице форма для добавления статьи и список всех статей. Данные сохраняются в SQLite.
FastAPI: Асинхронный веб-сервис с фоновыми задачами и валидацией
Пример использования BackgroundTasks и Pydantic.
from fastapi import FastAPI, BackgroundTasks, Depends, HTTPException
from pydantic import BaseModel
import time
app = FastAPI()
def write_log(message: str):
with open('log.txt', 'a') as f:
f.write(f'{time.ctime()}: {message}\n')
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.post('/items/')
async def create_item(item: Item, background_tasks: BackgroundTasks):
background_tasks.add_task(write_log, f'Created item {item.name}')
return {'item': item}
@app.get('/items/{item_id}')
def read_item(item_id: int, q: str = None):
return {'item_id': item_id, 'q': q}При POST-запросе с JSON-телом происходит создание записи в логе (фоново). GET /items/1?q=test возвращает параметры. Документация на /docs.
Pelican: Статический блог с плагинами и кастомной темой
Настройка pelicanconf.py:
SITENAME = 'Мой блог'
SITEURL = ''
PATH = 'content'
TIMEZONE = 'Europe/Moscow'
DEFAULT_LANG = 'ru'
THEME = 'themes/custom'
PLUGIN_PATHS = ['plugins']
PLUGINS = ['sitemap', 'feed']Создание статьи content/2024-01-15-post1.md:
Title: Первая статья
Date: 2024-01-15 10:20
Category: Новости
Текст статьи на русском языке.Команда генерации: pelican content. Результат: папка output с HTML-файлами.
После открытия index.html в браузере отображается список статей.