Начальная настройка блога на django
Настройка нового Django проекта состоит из следующих этапов:
Не забудьте поставить точку . в конце команды для создания нового проектаblog_project.
Сообщим Django о новом приложении. Для этого откроем в текстовом редакторе файл settings.py и добавим в конце переменной INSTALLED_APPS наше приложение:
Загружаем файлы блога на github
Пришло время для коммита изменений на github. Начинаем с инициализации нашей директории.
Затем осматриваем все изменения и добавления в коде, через команду status. Добавляем все новые файлы. После этого делаем первый коммит.
Как добавить поля к регистрации:
Также иногда нужно добавлять свои поля для регистрации, для этого нужно добавить файл с формой, который будет называя «forms.py», а вот его код.
Как реализовать авторизацию на django?
Добре, товарищи программисты и ищущие решение проблемы человеки.
Я реализовал регистрацию в джанго и авторизацию, но беда в том, что я не могу проверить вошел ли я.
В джанго я совсем зеленый, сильно палками не кидайтесь.
views.py
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm
from django.shortcuts import render, redirect
def user_login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
user = authenticate(username=cd['username'], password=cd['password'])
if user is not None:
if user.is_active:
login(request, user)
return redirect('/')
else:
return HttpResponse('Disabled account')
else:
return HttpResponse('Invalid login')
else:
form = LoginForm()
return render(request, 'login/account_login.html', {'form': form})
forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Вход на сайт</h1>
{% if error %}
<div style="color:red;">{{ error }}</div>
{% endif %}
<form method="post" action="" class="login">
{% csrf_token %}
<p>
<label for="login">Логин:</label>
<input type="text" name="login" id="login" >
</p>
<p>
<label for="password">Пароль:</label>
<input type="password" name="password" id="password" >
</p>
<p class="login-submit">
<button type="submit" class="login-button">Войти</button>
</p>
</form>
</body>
</html>
Возможно в коде есть ошибки, но я очень долго ломаю голову над этим проектом, любая критика приветствуется.
Upd: При вводе пароля и логина происходит обновление страницы и на этом всё.
Как перезапустить проект на django
Если вы изменили файлы проекта и хотите увидеть изменения, то вам необходимо перезапустить проект. Для этого создайте файл restart.txt в папке tmp, которая располагается в директории вашего сайта (если каталог tmp отсутствует, то создайте его). Чтобы повторно перезапустить проект, удалите файл restart.txt и создайте его еще раз.
Как установить django
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.В строке os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘project_name.settings’ измените project_name на название вашего проекта.
- 18.Сохраните файл passenger_wsgi.py.
Готово, по адресу вашего домена должна отобразиться стартовая страница Django.
Настройка url маршрутов для блога на django
Для отображения записей блога на главной странице, настроим конфигурацию файла blog_project/urls.py, а также файла blog/urls.py.
В командной строке выключаем запущенный веб-сервер через комбинацию CTRL C и создаем новый файл urls.py внутри приложения blog:
Теперь заполняем его содержимое используя ниже предоставленный код.
В верхней части импортируем будущие представления. Пустые одинарные кавычки ” говорят Django принимать все значения и создать именованный URL home, к которому можно будет позже отсылаться из представлений (views).
Мы также должны обновить файл blog_project/urls.py, чтобы в дальнейшем все запросы направлялись напрямую к приложению blog.
Мы добавили функцию include() на второй строке и URL паттерн, используя пустую строку регулярного выражения”, указывая, что URL запросы должны быть перенаправлены к обработчику URL маршрутов от приложения blog для последующих инструкций.
Панель администратора для блога на django
Сейчас нам нужно получить доступ к данным. Прежде всего нам нужно создать аккаунт администратора, введя указанные ниже команды и следуя дальнейшим указаниям по настройке электронной почты и пароля. Обратите внимание, что при вводе пароля он не будет отображаться на экране, это делается в целях безопасности.
Пишем testcase для блога на django
Теперь нужно проверить нашу модель и представления (views). Необходимо убедиться, что модель Post работает как надо. Также протестируем общие классы представлений ListView и DetailView.
Образец тестов в blog/tests.py будет выглядеть следующим образом.
from .models import Post
class BlogTests(TestCase):
def setUp(self):
self.user = get_user_model().objects.create_user(
username=’testuser’,
email=’test@email.com’,
password=’secret’
)
self.post = Post.objects.create(
title=’A good title’,
body=’Nice body content’,
author=self.user,
)
def test_string_representation(self):
post = Post(title=’A sample title’)
self.assertEqual(str(post), post.title)
def test_post_content(self):
self.assertEqual(f'{self.post.title}’, ‘A good title’)
self.assertEqual(f'{self.post.author}’, ‘testuser’)
self.assertEqual(f'{self.post.body}’, ‘Nice body content’)
def test_post_list_view(self):
response = self.client.get(reverse(‘home’))
self.assertEqual(response.status_code, 200)
self.assertContains(response, ‘Nice body content’)
self.assertTemplateUsed(response, ‘home.html’)
def test_post_detail_view(self):
response = self.client.get(‘/post/1/’)
no_response = self.client.get(‘/post/100000/’)
self.assertEqual(response.status_code, 200)
self.assertEqual(no_response.status_code, 404)
self.assertContains(response, ‘A good title’)
self.assertTemplateUsed(response, ‘post_detail.html’)
# blog/tests.py fromdjango.contrib.auth importget_user_model fromdjango.testimportTestCase fromdjango.urls importreverse from.models importPost classBlogTests(TestCase): defsetUp(self): self.user=get_user_model().objects.create_user( username=‘testuser’, email=‘[email protected]’, password=‘secret’ ) self.post=Post.objects.create( title=‘A good title’, body=‘Nice body content’, author=self.user, ) deftest_string_representation(self): post=Post(title=‘A sample title’) self.assertEqual(str(post),post.title) deftest_post_content(self): self.assertEqual(f‘{self.post.title}’,‘A good title’) self.assertEqual(f‘{self.post.author}’,‘testuser’) self.assertEqual(f‘{self.post.body}’,‘Nice body content’) deftest_post_list_view(self): response=self.client.get(reverse(‘home’)) self.assertEqual(response.status_code,200) self.assertContains(response,‘Nice body content’) self.assertTemplateUsed(response,‘home.html’) deftest_post_detail_view(self): response=self.client.get(‘/post/1/’) no_response=self.client.get(‘/post/100000/’) self.assertEqual(response.status_code,200) self.assertEqual(no_response.status_code,404) self.assertContains(response,‘A good title’) self.assertTemplateUsed(response,‘post_detail.html’) |
Подключение статических файлов в django
Сейчас нам потребуется использовать CSS стили, что по сути являются статическими файлами, так как в отличие от динамического содержимого базы данных, они не меняются. К счастью, в Django можно напрямую добавить статические файлы вроде CSS, JavaScript или изображения.
При создании сайтов для улучшения производительности файлы обычно хранят на CDN сервере. CDN сервер предоставляет возможность пользователю получить статические файлы быстрее в зависимости от его страны. Однако, для нашего проекта статические файлы мы будет хранить на том же сервере что и сам Django.
Закрываем локальный веб-сервер через CTRL C. Создаем новую директорию под названием static.
Как и в случае с директорией templates, сейчас нам понадобится обновить файл settings.py для уведомления Django о месте поиска статических файлов. В settings.py потребуется изменить переменную STATICFILES_DIRS. Внесем изменения в нижнюю часть файла под переменной STATIC_URL.
Теперь внутри static создаем директорию css и добавляем новый файл base.css в нее.
Что добавить в файл? Может, поменяем цвет заголовка на красный?
В конце нужно включить статические файлы в наши шаблоны, добавив {% load static %} в верхнюю часть base.html. Так как остальные шаблоны унаследуют каркас от base.html, то редактировать надо будет только этот файл. Добавляем новую строку в шаблоне, она напрямую отсылает к новому файлу base.css.
Ну вот, мучениям пришел конец. Теперь можно добавить статические файлы в директорию static, после чего они автоматически появятся во всех шаблонах.
Представления — bloglistview для отображения записей блога
Сейчас мы будем использовать классовые представления, однако при создании приложения для блога также можно применить функционально-ориентированный подход. При желании более подробно изучить второй вариант можете ознакомиться с уроками от Django Girls Tutorial. Отличная вещь!
В файле views.py добавьте указанный ниже код, который нужен для отображения содержимого из модели Post при использовании ListView от Django.
Первые две строчки импортируют ListView и модель нашей базы данных Post. Мы наследуем классListView и добавляем отсылку к модели и указываем на HTML файл шаблона. Это позволяет сэкономить на коде, избавляя от необходимости написания дополнительного кода с нуля.
Реализация аутентификации пользователя в django/python — разработка на
Давайте поговорим сегодня о том, как можно упростить администрирование и обеспечить двухфакторную авторизацию пользователей для более безопасной работы в Django.
193просмотров
Django – это фреймворк для работы с данными с использованием доступа через Web. Один из видов MVC — и называется MVT.
Нередко при реализации модуля администрирования в Django требуется передача пользователю информации о том, что ему дали доступ к серверу с указанием имени пользователя и пароля.
Для таких случаев возможна следующая реализация (использованы Centos 7, Python 2.7, Django 1.11):
Для реализации выполним следующие несложные действия:
Необходимо использовать свою модель пользователей, где будут добавлены поля (файл models.py):
- phone(Номер телефона),
- is_adm(пользователи поделены на админов и на обычных пользователей),
- number (временное хранение кода доступа)
Изменим вид формы заполнения данных о пользователе, где заранее установим значение пароля по умолчанию равным, например, ‘Aa12345678’(файл forms.py):
При открытии формы видно, что поле «Пароль» уже заполнено и недоступно для редактирования (серый цвет). Заносим остальные данные и сохраняем.
После нажатия кнопки «Сохранить», пользователь будет создан и ему на почту придет сообщение:
И мы видим, что пароль установлен отличный от пароля по умолчанию.
Это достигается при сохранении данных о пользователе (файл views.py — для нового пароля использован генератор случайных чисел):
Пользователь, получив сообщение, может уже входить в систему:
Для дальнейшей возможности авторизации у пользователя будет запрошен разовый код:
Который направлен на почтовый ящик:
Или на телефон (здесь имитация реализована через сервис портала smsc.ru, с подключением файла smsc_api.py):
Пользователь вводит код:
Код реализации для отправки кода авторизации в файле views.py:,
Для отправки почтовых сообщений вносим необходимые изменения в файл settings.py:
Таким образом, внеся небольшие дополнения в код, можно упростить администрирование и обеспечить двухфакторную авторизацию пользователей для более безопасной работы.
Создаем отдельную страницу detailview для статьи
Теперь можно добавить функционал для индивидуальных страниц блога. Как это сделать? Понадобится новое представление (view), настройка url маршрута и HTML шаблон. Надеюсь, вы уже уловили суть и правила разработки c Django.
Начнем с представления. Для простоты можем использовать общий класс DetailView. В верхней части файла импортируем DetailView и затем создаем новое представление под названием BlogDetailView.
В новом представлении мы указываем на используемую модель Post, а также на файл HTML шаблона, с которым нужно ее ассоциировать — post_detail.html. По умолчанию DetailView предоставляет объект содержимого модели, которого мы можем использовать в шаблоне для получения данных о статье, название переменной зависит от названия модели, в нашем случае это post.
Закрываем локальный веб-сервер через CTRL C и создаем новый HTML шаблон для просмотра записей на отдельной странице:
Далее набираем следующий код:
В верхней части уточняется, что данный шаблон наследует структуру от base.html. Затем показывается заголовок и содержимое статьи из объекта post, данную переменную предоставляет общий класс представления DetailView в зависимости от названия нашей модели.
В начале изучения Django мне казалось, что именование объектов содержимого в представлениях сильно запутывает. Из-за того, что объект содержимого из DetailView является моделью с названием post или object, можно было бы обновить шаблон используя переменную object вместо post, при этом он бы работал как и раньше.
Если использование post или object кажется вам запутанным, можно напрямую именовать объект содержимого в представлении, задействовав context_object_name.
«Магическое» именование объекта содержимого становится своего рода платой за простоту использования общих представлений (generic views). Они являются отличным вариантом, если известен их функционал, поэтому лучше заранее ознакомиться с особенностями настройки в официальной документации.
Что дальше? Добавим новый URL маршрут для работы с отдельными статьями в зависимости от их ID.
Все записи блога будут начинаться с post/. Рассмотрим первичный ключ для записи, который будет представлен целым числом <int:pk>. Что такое первичный ключ, спросите?
Django автоматически добавляет автоинкрементный первичный ключ к модели базы данных. В то время, как мы просто обозначили поля title, author и body в модели Post, Django автоматически добавил еще одно поле под названием id, которое и является первичным ключом. Получить к нему доступ можно через id или pk.
У первой записи «Hello, Worl» pk будет 1. У второй записи ID = 2. И так далее. Следовательно, если перейти на индивидуальную страницу первого поста, структура его url будет post/1.
Зачастую новички испытывают сложности, пытаясь разобраться с принципом работы первичных ключей. Будет не лишним подробнее остановиться на предыдущих двух параграфах, ну, а с практикой данный аспект разработки станет привычным.
Создание модели post для работы с записями блога
Каковы характеристики типичного блога? Не будем усложнять задачу, остановимся на том, что у каждой записи должен быть:
- Заголовок;
- Автор;
- Содержимое.
Все это можно превратить в модель базы данных, наполните файл blog/models.py следующим содержимым:
В верхней части импортируется класс models, а затем модель Postнаследует классmodels.Model. Используя функциональные особенности наследника, мы автоматически получаем доступ ко всем данным внутри родительского класса django.db.models.Models. Теперь можно добавлять дополнительные поля и все необходимые нам методы.
Для заголовка title ставим ограничение на 200 символов, а для содержимого статьи body используем тип TextField, что автоматические расширяется, подстраиваясь под длину текста пользователя. В Django доступно множество типов полей, с полным списком которых можете ознакомиться здесь.
Создание шаблона для блога на django
Настройка URL маршрутов и представления готовы, остались только разобраться с шаблонами. Здесь можно унаследовать свойства других шаблонов, чтобы сохранить текущий код чистым. Начнем с файла base.html и файла home.html, который наследует структуру от него.
Создадим новую директорию templates и два HTML файла шаблонов внутри нее.
Теперь обновляем файл settings.py, для того чтобы Django понимал в какие еще директории искать наши файлы шаблона.
Затем обновляем шаблон base.html следующим образом.
Заключение
Теперь мы знаем как создать блога на Django с нуля. При помощи использования панели администратора Django нам под силу создать, отредактировать и удалить запись. Мы также впервые использовали DetailView для создания индивидуального представления для каждой записи блога.
Вывод:
В этой статье вы прочитаете, как делается регистрация на Python Django 3, тут мы показали как сделать самый как сделать используя базовую форму регистрации и как её дополнить.