Существует множество веб-фреймворков на Python, самые известные из них — django, flask, tornado. Как старомодный фреймворк, django имеет очень высокое качество с точки зрения документации и кода. Кроме того, он поставляется с собственным административным фоном и некоторыми полезными приложениями. Если вам нужно делать веб-приложения, такие как cms, вы в основном не Не нужно разрабатывать много кода, можно получить готовый продукт. Тем не менее, многие новички могут сначала не адаптироваться к его шаблонам проектирования, и они в основном запутываются после столкновения с проблемами, поэтому здесь я напишу некоторые практики применения django в соответствии с моим собственным опытом использования django, который может быть относительно разбросан, пожалуйста, простите меня.
Общий процесс
Прежде всего, мы должны понять общий поток обработки фреймворка django.Предположим, мы используем режим веб-сервера nginx + uwsgi + django.
1. После прихода запроса он сначала проходит через nginx в качестве обратного прокси и перенаправляет запрос на uwsgi (python использует протокол wsgi для разбора http-запросов, uwsgi — это приложение, которое анализирует wsgi), а uwsgi отправляет обработанные данные на Джанго.
2. После того, как django получит запрос, он сначала пройдет через набор глобального промежуточного программного обеспечения, вызывая process_request в качестве предварительной обработки, такой как анализ статуса пользователя, проверка csrf_token (запрос отправки) и возврат ответа напрямую, если есть проблема, больше не Вызов функции просмотра. В противном случае вызовите process_view и введите функцию просмотра, если нет проблем.
3. После входа в функцию просмотра разработчики могут написать свою собственную логику, такую как работа с базой данных, обновление кеша и, наконец, возврат ответа.
4. Затем выйдите из функции просмотра, снова войдите в промежуточное ПО, вызовите process_response, внесите некоторые окончательные изменения в ответ и верните его пользователю.
модуль просмотров
1. Представление может не только использовать функции, но и использовать универсальные классы представления (generic_view), преимущества: более понятный код, возможность повторного использования наследования, возможность разработки более гибкого модуля представления в сочетании с миксинами.
def hello_fn(request, name="World"):
return HttpResponse("Hellp {}!".format(name))
class FeedMixin(object):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["feed"] = models.Post.objects.viewable_posts(self.request.user)
return context
class MyFeed(FeedMixin, generic.CreateView):
model = models.Post
template_name = "myfeed.html"
success_url = reverse_lazy("my_feed")
2. Декоратор Python очень полезен, и его также можно использовать для функции представлений.Например, декоратор ниже используется для обнаружения вошедшего в систему пользователя
@login_required
def simple_view(request):
return HttpResponse()
модуль URL
1. urls.pyЭтот файл сопоставляет доступный URL-адрес с модулем просмотра, сопоставляя сверху вниз
2. Функцию включения можно использовать для включения URL-адресов других приложений. После определения параметра пространства имен его можно вызывать непосредственно в шаблоне, например
{% url 'articles'%}
url(r'^articles/$', include(articles.urls), namespace="articles"),
модуль моделей
1. Модель — это класс с объектно-ориентированным подходом к работе с базой данных, позволяющий программистам, не знакомым с операторами базы данных, быстро работать с базой данных.
2. Создайте объектно-ориентированный класс и добавьте abstract = True, чтобы сделать абстрактный класс.
class Postable(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = modified.DateTimeField(auto_now=True)
message = models.TextField(max_length=500)
class Meta:
abstract = True
class Post(Postable):
...
class Comment(Postable):
···
3. Между таблицами django существуют соответствующие отношения один к одному (OneToOneField), один ко многим (ForeignKey) и многие ко многим (ManyToManyField) Режим «многие ко многим» реализуется путем создания промежуточного Таблица.
class Book(models.Model):
place = models.OneToOneField(Place, primary_key=True)
pub=models.ForeignKey(Publisher)
authors=models.ManyToManyField(Author)
Приведенный выше пример промежуточной таблицы включает author_id и book_id.
4. Сигнал django реализует поведение записи базы данных ловушек, такое как pre_save, post_save, pre_delete, post_delete, вы также можете настроить сигнал, ловушку и другое поведение.
@receiver(post_save, sender=TransactionDetail, dispatch_uid="update_stock_count")
def update_stock(sender, instance, **kwargs):
instance.product.stock -= instance.amount
instance.product.save()
5. Person.objects.all(), объекты в нем фактически являются менеджером, который реализует такие функции, как все и фильтр, и может быть настроен.
class Person(models.Model):
object = models.Manager()
6. Набор запросов Django ленив. Он будет запрашивать базу данных только тогда, когда она действительно используется. После одного запроса будет кеш. При повторном обходе набора запросов он не будет запрашиваться снова.
person_set = Person.objects.filter(first_name="Dave")
7. После того, как база данных будет создана в первый раз, потребуется снова обновить поля. Django не имел этой функции до версии 1.4.Его приходилось обновлять сторонней библиотекой south.Поздние версии django поставлялись с функцией миграции, которая может сравнивать последнюю версию модели с полями базы данных и автоматически генерировать миграцию файлы.
python manage.py makemigrations # 生成 migration 文件
python manage.py migrate # 将更改应用到数据库
8. ORM не может напрямую видеть необработанный оператор sql, вы можете просмотреть sql с помощью следующего оператора
from django.db import connection
connection.queries
9. Вы можете использовать плагин django-debug-toolbar для просмотра медленных запросов и получения общего представления о том, какие страницы загружаются медленно.
10. Используйте select_related() в форме, чтобы уменьшить количество запросов к базе данных: select_related() автоматически расширяет отношения внешнего ключа
class Province(models.Model):
name = models.CharField(max_length=10)
class City(models.Model):
name = models.CharField(max_length=5)
province = models.ForeignKey(Province)
citys = City.objects.select_related().all()
Однако внешние ключи не рекомендуются для приложений с высокой степенью параллелизма.
модуль форм
1. ФОНД-конец зарабатывает значения формы, но невозможно подтвердить, являются ли эти значения пустыми или правильными типами. В это время, конечно, вы можете судить о значениях один за другим Сам, или вы можете использовать модуль форм для проверки. Я использовал Django-Rest-Cramework Students, узнает, что это та же концепция, что и сериализаторы внутри
class PersonDetailsForm(forms.Form):
name = forms.CharField(max_length=100)
age = forms.IntegerField()
2. Если вы используете метод рендеринга шаблона, его проще отображать, и форма может автоматически генерировать html-форму.
>>> f = PersonDetailsForm()
>>> print(f.as_p())
<p><label for="id_name">Name:</label> <input id="id_name" maxlength="100"
name="name" type="text" /></p>
<p><label for="id_age">Age:</label> <input id="id_age" name="age"
type="number" /></p>
модуль администратора
1. админка в принципе работает из коробки, если нужно настроить, то можно и некоторые компоненты настроить, но чтобы подробнее узнать об этих вещах, нужно читать документацию.
модуль команд
1. django предоставляет модуль фонового скрипта, вы можете самостоятельно интегрировать класс BaseCommand, чтобы настроить скрипт
python mannage.py -h
Эта команда может видеть все команды команды
2. Если вы не хотите использовать его модули и хотите ввести некоторые модули проекта django, вы можете использовать следующие методы для решения этой проблемы.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
django.setup()
модуль настроек
1. Все значения настроек по умолчанию можно найти здесь,https://github.com/django/django/blob/master/django/conf/global_settings.py
2. Не забудьте изменить DEBUG на False при подключении к сети, а затем добавить ALLOWED_HOSTS.
3. MEDIA_ROOT, MEDIA_URL, STATIC_ROOT, STATIC_URL раньше часто путали, но их можно разделить на две категории, MEDIA_ROOT относится к каталогу, в который загружен файл, MEDIA_URL относится к имени префикса,пример.com/Медиа/,Носитель — MEDIA_URL. Точно так же STATIC_ROOT относится к каталогу статических файлов, обычно css, js и т. д. STATIC_URL стоит префикса имени,пример.com/static/.
4. Когда общее развертывание будет подключено к сети, используйте nginx для рендеринга статических файлов напрямую.
location /media {
alias /root/example_project/public/media;
}
location /static {
alias /root/example_project/static;
}
вкладные модули
1. Модули здесь — это приложения, которые поставляются с django, и большинство из них — admin, auth, session
2. Модуль администратора на самом деле является фоном django
3. Модуль авторизации — это пользовательский модуль с полным набором функций, который в основном может быть расширен на основе этого модуля.
4. Модуль сеанса в сочетании с авторизацией используется для статуса входа пользователя.Для больших веб-сайтов хранение сеанса может быть проблемой.Django также предоставляет различные бэкэнды для поддержки базы данных, кеша, файла и других методов хранения.
промежуточный модуль
1. Промежуточное программное обеспечение, которое поставляется с django, вполне подходит для нужд обычных веб-сайтов, таких как CsrfMiddleware и HttpMiddleware.
2. Если у вас есть свои собственные потребности, вы также можете настроить его, например, запись подробной информации журнала, LogMiddleware и междоменное CorsMiddleware.
разное
1. Некоторые люди в Интернете говорят, что django может делать только небольшие веб-сайты и не поддерживает большой параллелизм, На самом деле это утверждение все еще очень однобоко. Сам по себе Django — это просто фреймворк, если обработка запросов сайта медленная, то во многих случаях написанная им же логика не оптимизирована. Если подтвердится, что это проблема фреймворка django, хотя django немного сложен по дизайну, многие модули все же можно разделить и настроить. В конце концов, это действительно нехорошо, и его можно превзойти, увеличив количество машин.
2. Модуль интернационализации django хорошо справляется со своей задачей
3. Файл настроек можно разделить на две части: продукт и разработка.Различные файлы настроек вводятся в зависимости от среды разработки и производственной среды.
4. django-celery используется для выполнения асинхронных задач
5. У Django много плагинов,rosarior/awesome-django
6. Обновите другие мысли. . .