Django курсовая работа

Разработка архитектуры веб-сервиса закрытой социальной сети с использованием фреймворка Django

Федеральное агентство по образованию
Российской Федерации

Государственное образовательное
учреждение

высшего профессионального образования

«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ
УНИВЕРСИТЕТ»

Кафедра математического моделирования

КУРСОВАЯ РАБОТА

Разработка архитектуры веб-сервиса
закрытой социальной сети с использованием фреймворка Django

Работу выполнила студентка 4-го курса

Михно В.Д.

Краснодар — 2013

Научный руководитель,

Доцент, к. ф-м. н.

С.Е. Рубцов


Содержание

Введение

1. Анализ закрытых социальных сетей

2. Структура Web-приложения

2.1 База данных и административная часть

2.2 Логическая часть приложения и отображение данных на страницах

Заключение

Список использованных источников

Приложение А

Приложение В


Введение

В настоящее время количество социальных сетей в Интернете и
численность их участников растет с невероятной быстротой. Социальные сети уже
сегодня посещает более чем две трети онлайн-аудитории во всем мире, и это
четвертая по популярности онлайн-категория после поисковых порталов, информационных
порталов и программного обеспечения, которая опережает даже электронную почту
(по данным компании Nielsen Online, исследующей онлайн поведение в 9 странах).
По данным той же компании, использование онлайн-сообществ сегодня растет вдвое
более быстрыми темпами, чем любой из четырех других секторов сети Интернета и в
три раза быстрее, чем пользование Интернетом в целом. Социальные сети (social
networks) привлекают людей, преследующих различные цели: поддержание контакта
со старыми знакомыми и поиск новых, в т. ч. обустройство личной жизни; поиск
работы, продвижение своего бизнеса, профессиональное общение; обмен информацией
и медиаконтентом с другими пользователями. В России социальные сети развиваются
с недавнего времени, но, не смотря на свою молодость многие сети, приобрели уже
огромную популярность.

Социальная сеть, в современном её понимании, является
интернет-сообщества пользователей, объединённых по какому-либо признаку на базе
одного сайта, который и называется в этом случае социальной сетью. Главным
фактором объединения пользователей в социальную сеть является какая-либо их
общность — финансовое положение, пол, принадлежность к той или иной расе,
национальности, вероисповеданию, профессии и так далее.

Интеграция обычных сайтов с внешними социальными сетями уже
довольно активно вошла в нашу жизнь. Многие миллионы сайтов тесно
интегрировались с самыми популярными сетями, и почти все новые проекты сегодня
создаются с интеграцией по умолчанию. Это может быть в виде ссылок на
официальные сообщества поклонников сайта в социальных сетях, могут быть кнопки
отправки информации в социальные сети, кнопки «мне нравится»,
интеграция интернет-магазинов для продажи товаров, специальные приложения для
работы с сетями, инструменты комментирования через социальные сети и многое
другое. Следующим шагом будет создание специализированных платформ для
интеграции, которые позволят создавать «социальную» экосистему внутри
сайтов, и пользователи, будучи залогиненными в Facebook или VK, смогут получать
все то же, что и в самой социальной сети, только при этом будучи на стороннем
сайте. Тот же процесс можно будет сделать и в обратном направлении:
пользователи смогут, не выходя из социальной сети, получать нужную им
информацию со сторонних сайтов. В свою очередь, внешние сайты с удовольствием
принимают инструменты интеграции, потому что это дополнительный приток
посетителей из сетей, а значит, и дополнительная прибыль. Так социальные сети
концентрируют в руках власть, можно сказать «подсаживают сайты на
интеграцию».

В тоже время компании понимают важность организации
коммуникации между пользователями внутри экосистем сайтов, не выпуская их
наружу и не доверяя этот важный процесс потенциальному конкуренту. Ведь
социальные сети быстро развиваются, а пользователи требуют новый контент,
поэтому не исключается риск создания сетью контента, близкого группе сайтов,
которые ранее интегрировались с определенной сетью, и тем самым превращение
огромной социальной сети в прямого конкурента для более мелкого сайта или
целого сегмента. Компании стараются создавать полезный социальный функционал,
который будет единым целым с сайтом и сможет привлечь новых пользователей.
Часто компании переделывают свои сайты в тематические социальные сети и
увеличивают свою популярность в разы.

Некоторые работодатели запрещают пользоваться социальными
сетями — не только ради экономии, но и чтобы воспрепятствовать утечке
информации.

закрытая социальная сеть фреймворк

В данной курсовой работе представлена разработка
веб-приложения, обеспечивающего социальные взаимоотношения между сотрудниками
владельца данного приложения. Что позволяет не только свести риск потери
конфиденциальной информации к минимуму, но и возможность ограничение доступа к
социальным сетям, компенсируя это наличием собственной закрытой социальной сети.


1. Анализ
закрытых социальных сетей

Кроме общедоступных «В Контакте» и Facebook,
существуют закрытые частные социальные сети, членство в которых доступно только
для избранных или для людей с определенной профессией. Рассмотрим некоторые из
них.Одна из самых первых эксклюзивных европейских социальных сетей, принимающая
только «людей из мира высокого искусства, которые определяются по трем
параметрам». Вы должны быть приглашены кем-то из существующих членов
данной сети, но даже в этом случае нет никакой гарантии, что вас примут.
Руководит сетью 25−летний швейцарец Патрик Лиотард-Войт (Patrick
Liotard-Vogt).

Рисунок 1 — Социальная сеть ASmallWorld

Одна из первых социальных сетей с элитными
участниками была основана в 2001 году тремя немецкими бизнесменами. Членство
обычно выдается по приглашению, хотя вы можете обратиться напрямую к создателям
с просьбой о вступлении.

Создатели сети описывают ее как
«оазис вдохновения и развлечений» для «космополитичного,
независимого, значимого, толерантного, либерального нонконформиста».

Рисунок 2 — Decayenne

.ru

Evrika.ru — закрытая социальная сеть для российских врачей.
Принадлежит медиа — группе «MedInform Healthcare Communications». Все
страницы сайта, кроме главной, не индексируются поисковиками и доступны только
зарегистрированным пользователям. Для получения доступа нужно быть действующим
врачом, способным подтвердить свои профессиональные знания и факт работы в
медицинском учреждении.

Имеется как социальная составляющая: профили пользователей,
обмен контактами и сообщениями, группы, комментарии; так и внутренний
информационный портал: медицинские новости, перепечатки научных статей из
российских и зарубежных журналов, оригинальные публикации медиков экспертного
уровня.

По нашему мнению, сайт нацелен на доходы от продвижения
лекарств, медоборудования и других изделий для здравоохранения в
профессиональную среду. Это подтверждает его интеграция с ресурсом
«МедМнение». Последний в интересах фармацевтических компаний проводит
опросы среди врачей и платит деньги за участие в них.

Социальная сеть для адвокатов.

Недавно созданная закрытая социальная сеть адвокатов набирает обороты.
Адвокатское сообщество России включает примерно 65000 человек.65000 человек
профессиональных юристов, объединенных Федеральным Законом «Об адвокатской
деятельности и адвокатуре в Российской Федерации», кодексом
профессиональной этики адвоката. Каждый адвокат, пришедший в сеть, чувствует
родную среду, плечо коллеги, единство интересов и профессионализм.

Структура закрытой социальной сети адвокатов синхронна существующей в
России структуре адвокатского сообщества. Адвокаты объединены в группы
адвокатских Палат регионов.

В сети нет ников, каждый знает с кем общается, ведь адвокат — открытая
профессия.

В сети нет места бюрократии, рекламе и платным услугам. Сеть создана
адвокатами и для адвокатов.

Закрытость проекта обусловлена не тайнами и интригами, а особым языком и
наречием. Темы и вопросы, обсуждаемые адвокатами, связаны именно с профессией.
Информационная площадка, объединяющая всех адвокатов России от Республики
Адыгея до республики Саха, дает возможность профессионального общения и
установления горизонтальных связей.

Разрозненная информация из адвокатских Палат регионов и адвокатских
образований собирается в одном месте и становится доступной каждому адвокату.

Сеть дает возможность общаться, обменяться опытом, обсуждать
правоприменительную практику, получить помощь коллеги и реальный практический
совет.

Постановка задачи

С помощью свободно распространяемого фреймворка Django для
веб-приложений, на языке Python, разработаем веб-приложение, компонентами
которого будут основополагающие части социальной сети: отправка сообщений,
поиск друзей, главная страница пользователя и лента новостей.

Первое что необходимо сделать, это подключить модуль
регистрации django-registration и систему идентификации пользователей,
предоставляющую работу с пользователями, группами пользователей, правами и
сессиями пользователей, работающими через cookies. Эта система представляется
приложением django. contrib. auth., обеспечивающее доступ к модели User,
которая будет отвечать за базу данных, в которую будут заноситься все
регистрируемые пользователи. Без регистрации доступ к страницам будет ограничен.

Весь функционал сайта разбит на 4 приложения. Первое должно
будет осуществлять отображение и редактирование личной информации. Второе
отображение новостей для всех пользователей. Третье поиск друзей по логину,
фамилии, имени или отчеству, а также возможность отправки сообщения,
добавления, удаления, отклонения и принятия в друзья другого пользователя. И
последнее четвертое, будет отвечать за обмен сообщениями между пользователями.

Каждое приложение будет состоять из двух частей:

·        Общедоступная часть, которая дает людям
возможность управлять своим профилем.

·        Административная часть, которая позволит
администратору редактировать базу данных сайта.

Эти две части будут реализовываться следуя шаблону
Модель-Представление-Контроллер (Model-View-Controller, MVC). Примем, что MVC
определяет способ разработки программного обеспечения при котором код для
определения и доступа к данным (модель, файл models. py) отделен от логики
приложения (управление, файл views. py), которая в свою очередь отделена от
интерфейса пользователя (представление, файл html).


2. Структура
Web-приложения

Как мы уже сказали, наше приложение будет строиться
основываясь на шаблоне MVC. MVC — это схема использования нескольких шаблонов,
с помощью которых модель данных приложения, пользовательский интерфейс
взаимодействие с пользователем разделены на три отдельных компонента так, что
модификация одного из компонентов оказывает минимальное воздействие на
остальные.

Основой проекта будут manage. py, __init__. py, settings. py,
urls. py, wsgi. py.

·        manage. py скрипт, который позволяет вам
взаимодействовать с проектом Django.

·        __init__. py пустой файл, который
указывает Python, что текущий каталог является пакетом Python.

·        settings. py настройки/конфигурация
проекта.

·        urls. py конфигурация URL-ов для вашего
проекта Django. Это «содержимое” всех Django-сайтов.

·        wsgi. py точки входа для WSGI-совместимый
веб-серверов.

Содержимое этих файлов представлено в ПРИЛОЖЕНИИ А.

Скачав и подключив модуль django-registration, и установив
приложение django. contrib. auth., можем переходить к той части проекта,
которая будет отвечать за функционал нашего сайта.

2.1 База
данных и административная часть

Рассмотрим модельную часть приложения, отвечающую за главную
страницу и редактирование данных пользователя.

Класс Profile будет содержать поля типа AutoOneToOneField,
ImageField, TextField, CharField и ManyToManyField.- связь один-к-одному, в
отличие от связи многие-ко-многим возвращает один объект. Указывает на модель
User и осуществляет доступ к объекту данной модели.

Поле ImageField — предназначено для загрузки изображения.

Рисунок 3 — Поле User типа AutoOneToOneField и поле Иконка
типа ImageField

Поле TextField — большое текстовое поле. Интерфейс
администратора отображает поле как <textarea>.- Строковое поле для
хранения коротких или длинных строк. Интерфейс администратора отображает поле
как <input type=»text»>.- Связь многое-ко-многому. Принимает
позиционный аргумент: класс связанной модели. В нашем случае мы используем это
поле для определения друзей для каждого пользователя. Использование в качестве
позиционного аргумента ‘self’, позволяет нам создать рекурсивную связь, т.е.
объект со связью многие-ко-многим на себя. Это значит, что мы будем помещать в
это поле ссылки на объекты из этой же модели.

В этом же файле models. py будут описаны две модели Message и
Chat, которые позволяют обмениваться сообщениями между друзьями.

Модель Message содержит два поля AutoOneToOneField,
DateTimeField, определяющее поле для ввода даты, CharFiels, TextField и
BooleanField (Рис.4). Последнее нам необходимо для определения, что сообщение
отправлено и принято (т.е. прочитано). Это поле будет заполняться галочкой,
когда получатель зайдет на страницу СООБЩЕНИЯ и просмотрит чат, в котором
появилось новое сообщение.

Рисунок 4 — Административная часть. Модель Message.

Что касается модели Chat, так она предназначена для
распределения всех объектов модели Message на чаты. Модель содержит два поля
многое-к-одному — ForeignKey, ссылающиеся на модель User, для определения
участников чата, и поле ManyToManyField для хранения объектов модели Message,
пара получатель и отправитель которых соответствует двум полям ForeignKey
модели Chat (Рис.5).

Рисунок 5 — Модель Chats. Объект модели содержащий 3 поля:
первые два для определения участников чата, а второе для хранения объектов
модели Message.

Теперь перейдем к файлу models. py приложения отвечающего за
новостную ленту.

Две модели Blog и Comment. Модель Blog ссылается, с помощью
поля ManyToManyField, на модель Comment. Модель Comment содержит два поля типа
TextField для распределения текста новости.

Если текст оказывается слишком большим, то пользователь большую
часть отправляет в нижнее поле, и на странице появляется новость только с тем,
что было в первом поле и ссылка «читать полностью >>».

При нажатии на эту ссылку появляется полный текст с
возможностью комментировать его.

Так как эти две модели похожи на Message и Chat, поэтому не
будем останавливаться на них. Они представлены в ПРИЛОЖЕНИИ В.

2.2
Логическая часть приложения и отображение данных на страницах

Функционал главной страницы представлен двумя функциями
my_profile и user_settings.

По названиям можно догадаться, какая функция за что отвечает.
Первая my_profile, будет отображать главную страницу пользователя (Рис. 6):

Рисунок 6 — Отображение данных модели Profile.

Как мы видим, внизу всех данных есть ссылка на редактирование
своих данных. Все поля для ввода каких-либо данных реализуются с помощью
модельных форм, которые аналогичны моделям, или просто форм. И те и другие
реализуются с помощью вспомогательных классов, которые описаны в ПРИЛОЖЕНИИ В.

Рисунок 7 — Редактирование данных модели Profile.

Весь код данных страниц представлен в ПРИЛОЖЕНИИ B.

Приложение, отвечающее за поиск друзей, позволяет находить по
фамилии, имени, отчеству и логину пользователя (Рис. 8).

Рисунок 8 — Поисковая форма

При нажатии на ссылку «Добавить в друзья», искомый
пользователь заносится в модель Profile в поле friends (ManyToManyField) и у,
добавляемого в друзья, пользователя в поле friend_requests модели Profile
отмечается тот пользователь, который только что прошел по ссылке «Добавить
в друзья» (Рис. 9).

Рисунок 9 — Административная часть. Поле ManyToManyField —
friend_requests. В этом поле выделяется синим пользователь, который хочет
добавиться в друзья.

На странице у добавленного друга автоматически появится
оповещение о пользователе, который его добавил в друзья и две ссылки
«Принять друга» и «Отклонить друга».

После этих операций у вас появляется список пользователей,
которых вы добавили себе в друзья, с возможностью удалить друга или написать
ему сообщение (Рис. 10).

Рисунок 10 — Страница с моими друзьями и возможностью поиска
новых.

Теперь рассмотрим функционал обмена сообщениями. При
прохождении в меню по ссылки СООБЩЕНИЯ мы попадаем на страницу где показаны
лишь чаты и их последние объекты из поля ManyToManyField — messages (Рис. 11).

Рисунок 11 — Страница сообщений. Отображение содержимого
модели Chat.

Как мы видим на Рис. 11 отобразилось одно поле, которое
содержит логин собеседника, дату последнего сообщения и само сообщение. Если
кто то присылает сообщение, то возле ссылки СООБЩЕНИЯ появляется число,
указывающее сколько новых сообщений (Рис. 12). Django позволяет самим создавать
теги, описывая их действия на языке Python. Реализация этого шаблонного тега
представлена в ПРИЛОЖЕНИИ В.

Рисунок 12 — Отображение появления нового сообщения.

В шаблоне вызов шаблонного тега осуществляется следующим
образом:

<p>СООБЩЕНИЯ{% if user. id|message_count %} ({{ user.
id|message_count}}) {% endif %}</p>

Далее заходим в СООБЩЕНИЯ и нажимаем на чат. Внизу чата видим
что новое сообщение отображается синим (Рис.13). При обновлении страницы синий
фон заменяется белым, как и у всех остальных сообщений.

Рисунок 13 — Отображение всех сообщений в данном чате.

При отправке нового сообщения, оно также будет становиться
синим и у самого отправителя, до тех пор, пока получатель его не прочтет (Рис.
14).

Рисунок 14 — Отправка сообщения собеседнику.

Ну и теперь переходим к последней части сайта — НОВОСТИ.

Страница содержит сортировку по датам, отображение всех
новостей и возможность добавлять свои новости (Рис. 15).

Рисунок 15 — Страница НОВОСТИ

Поля «Архивы» генерируются автоматически при
добавлении новой новости с другим месяце и годом. При прохождении по одной из
таких ссылок на страницу отображаются только те новости, у которых дата
публикации обладает таким же месяцем и годом. При переходе по ссылке
«Читать полностью >>», мы переходим на страницу, которая отображает
всю новость, и внизу появляется поле для ввода комментария (Рис.16). Система
отображения новых комментариев такая же как и у сообщений. Пока отправитель
новости не прочтет новый комментарий, фон будет оставаться синим.

Рисунок 16 — Просмотр всей новости и комментариев к ней.

При нажатии на ссылку «Отправить сообщение»,
появляется форма для написания новости (Рис.17). Как мы уже говорили в разделе
3.1, если текст слишком велик, то пользователь может разбить его на две части,
так что бы на главной странице новостей была видна только первая часть новости.

Рисунок 17 — Форма для заполнения новости.


Заключение

Результатом данной работы является разработка четырех
приложений и построенная модель данных с помощью классов Python, по которой
сгенерировалась схема базы данных. Данное приложение реализует все поставленные
задачи.

Приложение будет полезно для крупных фирм, которым необходим
постоянный и быстрый обмен информации, при этом минимизируя утечку информации
за пределы данного сообщества. Написанное приложение можно легко привязать к
любому сайту, разработанного с использованием фреймворка Django, который с
каждым годом становится все более и более популярным.

Планируется дальнейшее развитие проекта — добавление фото — и
видео — галереи, а также, с помощью API Яндекс. translate и API Яндекс. Карты,
добавить перевод всего сайта и размещения на изображении местности различных
графических объектов.

Следовательно, приложение не утратит актуальности и будет в
дальнейшем гораздо полезнее.


Список
использованных источников

1.      Форсье
Дж., Биссекс П., Чан У. Django. Разработка веб-приложений на Python. — Пер. с
англ. — СПб.: Символ-Плюс, 2010. — 456 с., ил.

2.      Лутц
М. Программирование на Python, том ӏ — ӏ ӏ, 4-е издание. — Пер. с англ. — СПб.:
Символ-Плюс, 2011. — 992с., ил.

3.      Django — http://ru.
wikipedia.org/wiki/Django <http://ru.wikipedia.org/wiki/Django>.

.        Object-Relational
Mapping — http://ru. wikipedia.org/wiki/ORM.

.        Django 1.5
documentation — https: // docs. djangoproject.com/en/1.5/
<https://docs.djangoproject.com/en/1.5/>.


Приложение А

Файл manage. py

#! /usr/bin/env pythondjango. core. management
import execute_managerimp:. find_module (‘settings’) # Assumed to be in the
same directory.

except ImportError:sys. stderr. write («Error: Can’t
find the file ‘settings. py’ in the directory containing %r. It appears you’ve
customized things. nYou’ll have to run django-admin. py, passing it your
settings module. n» % __file__). exit (1)settings__name__ ==
«__main__»:_manager (settings)

Файл setting. py

# — * — coding: utf-8 — *-

# Django settings for SA project.

DEBUG = True_DEBUG = DEBUG= (

# (‘Your Name’, ‘your_email@example.com’),

)= ADMINS

«»»

пароль и логин если я опять как обычно забуду

для админки

«»»= {

‘default’: {

‘ENGINE’: ‘django. db. backends. mysql’, # Add
‘postgresql_psycopg2’, ‘postgresql’, ‘mysql’, ‘sqlite3’ or ‘oracle’.

‘NAME’: ‘kfnexus_kurs’, # Or path to database file if
using sqlite3.

‘USER’: ‘045320128_kurs’, # Not used with sqlite3.

‘PASSWORD’: ‘12345’, # Not used with sqlite3.

‘HOST’: ‘127.0.0.1’, # Set to empty string for localhost.
Not used with sqlite3.

‘PORT’: ‘3306’, # Set to empty string for default. Not
used with sqlite3.

}

}

«»»

№ настройки для локалхсота_HOST = ‘192.168.137.12’_PORT =
‘1025’

«»»_USE_TLS = True_HOST = ‘smtp.
jino.ru’_HOST_USER = ‘test@epsilon-design.ru’_HOST_PASSWORD = ‘test’_PORT =
587_ZONE = ‘Europe/Moscow’_CODE = ‘ru-ru’_ID = 1_I18N = True_L10N =
True_URLCONF = ‘SA. urls’

SITE_ROOT = ‘/home/users1/k/kfnexus/django/kurs2/SA/’_ROOT =
‘/home/users1/k/kfnexus/domains/kurs2. epsilon-design.ru/’ + ‘media/’_URL =
‘/media/’_ROOT = ‘/home/users1/k/kfnexus/domains/kurs2. epsilon-design.ru/’ +
‘static/’_URL = ‘/static/’_MEDIA_PREFIX = ‘/admin/’_DIRS = ()_FINDERS = (

‘django. contrib. staticfiles. finders. FileSystemFinder’,

‘django. contrib. staticfiles. finders.
AppDirectoriesFinder’,

)_KEY = ‘%jh+z=pal8) *6=m3@=-e ( (p66nhy2ej (yc! ^g4n8qgo*z)
_$d-‘_CONTEXT_PROCESSORS = (

«django. contrib. auth. context_processors. auth»,

«django. core. context_processors. request»,

«django. core. context_processors. i18n»,

‘django. contrib. messages. context_processors. messages’,

‘django. core. context_processors. debug’,

‘django. core. context_processors. media’,

‘django. core. context_processors. static’,

)_CLASSES = (

‘django. middleware. csrf. CsrfViewMiddleware’,

‘django. middleware.common.commonMiddleware’,

‘django. contrib. sessions. middleware. SessionMiddleware’,

‘django. contrib. auth. middleware.
AuthenticationMiddleware’,

‘django. contrib. messages. middleware. MessageMiddleware’,

‘django. middleware. doc. XViewMiddleware’,

‘django. middleware. locale. LocaleMiddleware’,

)_DIRS = (_ROOT + ‘teamplates’,

)_APPS = (

‘SA. filebrowser’,

‘django. contrib. auth’,

‘django. contrib. contenttypes’,

‘django. contrib. sessions’,

‘django. contrib. sites’,

‘django. contrib. messages’,

‘django. contrib. staticfiles’,

‘django. contrib. admin’,

‘django. contrib.comments’,

‘registration’,

# курсовая:

‘SA. user_profile’,

‘SA. rialto’,

‘SA. blog’,

‘SA. kurs’,

‘SA. friends’

)= {

‘version’: 1,’disable_existing_loggers’: False,

‘handlers’: {

‘mail_admins’: {

‘level’: ‘ERROR’,

‘class’: ‘django. utils. log. AdminEmailHandler’

}

},

‘loggers’: {

‘django. request’: {

‘handlers’: [‘mail_admins’],

‘level’: ‘ERROR’,

‘propagate’: True,

},

}

}_noop = lambda s: s_LANGUAGES = (

(‘ru’, gettext_noop (‘Russian’)),

(‘en-us’, gettext_noop (‘US English’)),

)= list (PAGE_LANGUAGES)= languages_BACKEND = «locmem:
// /? max_entries=5000″_USE_SITE_ID = True_ID = 1

‘plugins’:
«autolink,lists,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,
iespell, inlinepopups,
insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template»,

‘theme’: «advanced»,

‘theme_advanced_buttons1’: «save,newdocument,|,bold,
italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect»,

‘theme_advanced_buttons2’:
«cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,
indent,blockquote,|,undo,redo,|,link,unlink,anchor, image,cleanup,help,code,|,
insertdate, inserttime,preview,|,forecolor,backcolor»,

‘theme_advanced_buttons3’: «tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,
iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen»,

‘theme_advanced_buttons4’:
«insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,
ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,
insertfile, insertimage»,

‘theme_advanced_toolbar_location’: «top»,

‘theme_advanced_toolbar_align’: «left»,

‘theme_advanced_statusbar_location’: «bottom»,

‘theme_advanced_resizing’: True,

‘custom_undo_redo_levels’: 10,»relative_urls»:
False,

}_FILEBROWSER = True_SPELLCHECKER = True_COMPRESSOR = False

# заставляем базу данных этого хостинга (sweb.ru)
работать с правильной кодировкой

«»»django. db import connection, transaction=
connection. cursor (). execute («SET NAMES ‘utf8’ COLLATE
‘utf8_general_ci'»).commit_unless_managed ()

«»»

#— — Настройки для джанго рестрации — —

ACCOUNT_ACTIVATION_DAYS = 7 # One-week activation window;
you may, of course, use a different value.

AUTH_PROFILE_MODULE = ‘user_profile. Message’_PROFILE_MODULE
= ‘user_profile. Profile’

Файл url. py

# — * — coding: utf-8 — *-django. conf. urls.
defaults import patterns, include, urldjango. conf import settingsdjango.
contrib import admindjango. contrib. staticfiles. urls import
staticfiles_urlpatternsSA. user_profile. models import ProfileSA. user_profile.
signals import *SA. user_profile. forms import RegistrationFormProfileSA.
user_profile. signals import *. autodiscover ()= patterns
(»,(r’^accounts/register/$’, ‘registration. views. register’, {‘backend’:
‘registration. backends. default. DefaultBackend’, ‘form_class’:
RegistrationFormProfile,},name=’registration_register’),

(r’^accounts/’, include (‘registration. backends. default.
urls’)),

# новый файлбраузер без гарппели(r’^admin/’, include
(admin. site. urls)),(r’^media/ (? P<path>. *) $’, ‘django. views.
static. serve’, {‘document_root’: settings. MEDIA_ROOT, }),(r’^static/ (?
P<path>. *) $’, ‘django. views. static. serve’, {‘document_root’:
settings. STATIC_ROOT, }),

(r’^person/user_settings/$’, ‘SA. kurs. views.
user_settings’),

(r’^$’, ‘SA. kurs. views. my_profile’),

(r’^friends/$’, ‘SA. friends. views. search_person’),

(r’^friends/add/ (? P<id> [^/] +) /$’, ‘SA. friends.
views. add_person’),

(r’^friends/del/ (? P<id> [^/] +) /$’, ‘SA. friends.
views. del_person’),

(r’^friends/accept/ (? P<objid> [^/] +) /$’, ‘SA.
friends. views. accept_friend’),

(r’^friends/reject/ (? P<objid> [^/] +) /$’, ‘SA.
friends. views. reject_friend’),

(r’^all_message/$’, ‘SA. friends. views. all_message’),

(r’^myfriends/$’, ‘SA. friends. views. my_friends’),

(r’^myfriends/sendmessage/ (? P<id> [^/] +) /$’, ‘SA.
friends. views. send_message’),

(r’^blog/new_news/$’, ‘SA. blog. views. new_news’),

(r’^blog/blog_all_text/ (? P<id> [^/] +) /$’, ‘SA.
blog. views. blog_all_text’),

(r’^blog/$’, ‘SA. blog. views. blog_views’),

(r’^blog/ (? P<slug> [^/] +) /$’, ‘SA. blog. views.
blog_sort’),

(r’^blog/ (? P<year> [^/] +) / (? P<month> [^/]
+) /$’, ‘SA. blog. views. blog_sort_date’),

)

Файл wsgi. py.os, sys_env = os. path. expanduser
(‘~/virtualenv/MyEnv’)_this = os. path. join (virtual_env, ‘bin/activate_this.
py’)(activate_this, dict (__file__=activate_this)). path. insert (0, os. path.
join (os. path. expanduser (‘~’), ‘django/kurs2’)). environ
[‘DJANGO_SETTINGS_MODULE’] = ‘SA. settings’django. core. handlers. wsgi=
django. core. handlers. wsgi. WSGIHandler ()


Приложение В

Главный шаблон всего сайта supreme.html.

<! DOCTYPE html PUBLIC «- // W3C // DTD HTML 4.01 //
EN»

«http://www.w3.org/TR/html4/strict. dtd»>

{% load user_profile %}

<html xmlns=»http://www.w3.org/1999/xhtml»
lang=»en»>

<head>

<meta http-equiv=»Content-Type»
content=»text/html; charset=utf-8″ />

<title>{% block title %}{% endblock %}
Chat+++</title>

<link type=»text/css»
href=»/media/yaml/core/base. css» rel=»stylesheet»>

<link type=»text/css»
href=»/media/css/styles. css» rel=»stylesheet»>

<script type=»text/javascript»
src=»/media/lib/jquery-1.7.1 min. js»></script>

<script type=»text/javascript»
src=»/media/lib/balrog. js»></script>

<meta name=»telderi»
content=»cba1d7c2e286711d42d0a79572178226″ />

</head>

<body>

<div>

</div>

<div>

<div>

<a href=»/»><div>

{% if user. is_authenticated %}

<div>

<ul>

<li><a>

<li><a>

<li><a href=»{% url auth_password_change
%}»>Сменить пароль</a></li>

</ul>

</div>

{% else %}

<div>

<form method=»post»
action=»/accounts/login/»>

<ul>

{% csrf_token %}

<li>

<input type=»text»>

</li>

<li>

<input type=»text»>

</li>

<li>

<input>

</li>

<li>

<input>

</li>

</ul>

</form>

</div>

{% endif %}

</div>

<div>

{% if user. is_authenticated %}

<div>

<ul>

<li><a href=»/»><img
src=»/media/images/search. png»/><p>МОЯ
СТРАНИЦА</p></a></li>

<li><a href=»/blog/»><img
src=»/media/images/notes.
png»/><p>НОВОСТИ</p></a></li>

<li><a href=»/all_message/»><img src=»/media/images/mail.
png»/><p>СООБЩЕНИЯ {% if user. id|messages_count %} ({{ user.
id|messages_count }}) {% endif %}</p></a>

</li>

<li><a href=»/friends/»><img
src=»/media/images/profile.
png»/><p>ДРУЗЬЯ</p></a></li>

</ul>

</div>

{% else %}

<div>

<img src=»/media/images/sitesimg. png»/>

<h2>Зарегестрируйтесь прежде чем пользоваться
сайтом</h2>

</div>

{% endif %}

</div>

<div>

{% block title_site_info %}

{% endblock %}

<div>

МЕСТО КУДА БУДЕТ ВЫВЕДЕН КОНТЕНТ ВСПЛЫВАЮЩИХ ОКОН

{% block main %}

{% endblock %}

</div>

<div>

<div>

{% block right %}

{% endblock %}

</div>

</div>

</div>

</div>

</body>

</html>

Файл models. py приложения user_profile.

# — * — coding: utf-8 — *-django. db import
modelsdjango. contrib. auth. models import UserSA. user_profile. fields import
AutoOneToOneFielddatetimeImagedatetimejsonmpttos. pathSA. settings import
*Profile (models. Model):= AutoOneToOneField (User, related_name=’profile’,
verbose_name= (‘User’), primary_key=True)= models. ImageField
(verbose_name=u»Иконка», upload_to=u»photos/%Y/%m/%d»,
help_text=u’Загрузите картинку’, blank=True)= models. TextField (verbose_name=u’Дополнительные
сведения’, blank=True)= models. CharField
(max_length=150,verbose_name=u’Логин’,blank=True)_name = models. CharField
(max_length=150,verbose_name=u’Фамилия’,blank=True)_name = models. CharField
(max_length=150,verbose_name=u’Имя’,blank=True)_name = models. CharField
(max_length=150,verbose_name=u’Отчество’,blank=True)= models. ManyToManyField
(«self», blank=True, symmetrical = False,
related_name=’friends_targets’)_requests = models. ManyToManyField
(«self», blank=True, symmetrical = False,
related_name=’friend_requests_targets’)= models. CharField (max_length=150,
verbose_name = u’ICQ’, blank=True)= models. CharField (max_length=150,
verbose_name=u’Skype’, blank = True)= models. CharField (max_length=150,
verbose_name=u’Телефон’, blank = True)__unicode__ (self):str (self.
user)get_thumbnail_url (self, width, height):

«»»Возвращает URL уменьшенной копии
фотографии»»»:not os. path. exists (self. thumbnail. path):
return None_url = None= str (self. thumbnail)_path_to_file = «%s/%s»
% (MEDIA_ROOT, photo)= self. thumbnail. path [self. thumbnail. path. rfind
(«/») +1:]_to = «»_to_thumbnail_dir =
«%s/thumbnails%s/%sx%s» % (MEDIA_ROOT, upload_to, str (width), str
(height))not os. path. exists (path_to_thumbnail_dir): os. makedirs
(path_to_thumbnail_dir)_to_thumbnail = «%s/%s» %
(path_to_thumbnail_dir, filename)not os. path. exists (path_to_thumbnail)::=
Image. open (self. thumbnail. path). thumbnail ( (width,height), Image.
ANTIALIAS). save (path_to_thumbnail, image. format, quality=95):None»%sthumbnails/%s%sx%s/%s»
% (MEDIA_URL, upload_to, str (width), str (height), filename):»get_thumbnail
(self):self. get_thumbnail_url (100, «*»)get_big (self):self.
get_thumbnail_url (600, «*»)get_min_thumbnail (self):self. get_thumbnail_url
(45, «*»)Message (models. Model):= models. ForeignKey (User,
verbose_name=u’Получатель’, related_name=’recipients’)= models. ForeignKey
(User, verbose_name=u’Отправитель’, related_name=’senders’)= models.
DateTimeField (verbose_name=u’Дата отправки сообщения’,blank=True, null=True,
default = datetime. datetime. now)= models. CharField
(max_length=350,verbose_name=u’Заголовок сообщения’,blank=True)= models.
TextField (blank=True,verbose_name=u’Сообщение’)= models. BooleanField
(blank=True,verbose_name=u’Сообщение отправлено’)Chat (models. Model):= models.
ForeignKey (User, verbose_name=u’Первый участник чата’,
related_name=’persons1′)= models. ForeignKey (User, verbose_name=u’Второй
участник чата’, related_name=’persons2′)= models. ManyToManyField (Message,
verbose_name=u’Все их сообщения’, blank=True,
related_name=’all_message’)last_message (self):self. messages. latest (‘date’)

Файл views. py для главной страницы и страницы настроек
личной информации.

# — * — coding: utf-8 — *-SA. user_profile. models
import Profiledjango. views. decorators. csrf import csrf_exemptdjango.
shortcuts import render_to_response, redirectdjango. template import
RequestContext # нужно чтобы передавать реквест в контекст

from django. forms import ModelFormdjango. http import
HttpResponse, HttpResponseRedirectdjango import formsdjango. db. models import
Qdjango. contrib. auth. models import Userdatetimetime

@csrf_exemptmy_profile (request):

# выводим все данные= Nonerequest. user.
is_authenticated ():= User. objects. get (pk = request. user. id)Profile.
objects. get (pk=request. user. id):= Profile. objects. get (pk = request.
user. id):= Profile (). user_id = vector. id. first_name = vector. first_name.
last_name = vector. last_name. save ()= {‘person’: object}render_to_response
(«kurs/my_profile.html», context, context_instance=RequestContext
(request)):

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response («kurs/error.html»,
{‘ErrorText’: u»Вы не авторизированны»}, context_instance=RequestContext
(request))

@csrf_exemptuser_settings (request):= Nonerequest. user.
is_authenticated ():ProfileForm (ModelForm):Meta:= Profile= (‘user’, ‘friends’,
‘friend_requests’)_password = forms. CharField (max_length=150,
required=False,label=’Новый пароль’)_password = forms. CharField
(max_length=150, required=False,label=’Подтвердить пароль’)_id = request. user.
idrequest. method == ‘POST’:= Profile. objects. get (pk = user_id)= ProfileForm
(request. POST, request. FILES, instance = object)form. is_valid ():_password =
form. cleaned_data [‘new_password’]_password = form. cleaned_data
[‘confirm_password’]= User. objects. get (pk = request. user. id). set_password
(new_password)new_password == »:= ‘Поле (новый пароль) пусто:
‘:confirm_password == new_password:= ‘Пароли совпадают! ‘. save ():= ‘Пароли не
совпадают! ‘. save ()= {‘form’: form, ‘error’: str, ‘object’:
object}render_to_response («kurs/user_settings.html», context,
context_instance=RequestContext (request)):= ProfileForm ()= Profile. objects.
get (pk = user_id)= ProfileForm (instance = object)= {‘form’: form, ‘object’:
object}render_to_response (‘kurs/user_settings.html’, context,
context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response
(«user_profile/error.html», {‘ErrorText’: u»Вы не
авторизированны»})

Шаблон error.html для вывода ошибки если пользователь не
зарегистрирован.

{% extends «main.html» %}

{% block main %}

<div>

<h2>Ошибка</h2>

{{ErrorText|safe}}

</div>

{% endblock %}

Шаблон my_profile.html для вывода личной информации
пользователя.

{% extends «main.html» %}

{% block main %}

<div>

<form enctype=»multipart/form-data»>

<table>

<tr>

<td>

{% if person. thumbnail == «» %}

<img src=»/media/images/default. png»/>

{% else %}

<img id=»img-{{ person. thumbnail }}»
src=»{{ MEDIA_URL }}{{ person. thumbnail }}»/>

{% endif %}

</td>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

<tr>

<td><p>

</tr>

</table>

<u><a>

</form>

</div>

{% endblock %}

Шаблон user_settings.html для вывода страницы настроек личной
информации.

{% extends «main.html» %}

{% block main %}

<div>

<h2>Профиль пользователя {{user. username}}</h2>

{% if form. thumbnail. value %}

<img id=»img-{{ object. thumbnail }}»
src=»{{object. get_thumbnail }}»/>

{% else %}

<img src=»/media/images/default. png»/>

{% endif %}

<form enctype=»multipart/form-data»
action=»» method=»post»>

<p>{{form. thumbnail}}</p>

<h4>Дополнительные сведения</h4>

<p>{{form. requisites}}</p>

<h4>Контактные данные</h4>

<p>{{form. user. label}}{{form. user}}</p>

<p>{{form. first_name. label}}{{form.
first_name}}</p>

<p>{{form. last_name. label}}{{form.
last_name}}</p>

<p>{{form. midlle_name. label}}{{form.
midlle_name}}</p>

<p>{{form. icq. label}}{{form. icq}}</p>

<p>{{form. skype. label}}{{form. skype}}</p>

<p>{{form. telephone. label}}{{form.
telephone}}</p>

<p>{{form. new_password. label}}{{form.
new_password}}</p>

<p>{{form. confirm_password. label}}{{form.
confirm_password}}</p>

{{error}}

<input>

</form>

</div>

{% endblock %}

{% block right %}

{% endblock %}

Шаблонный тег для вывода количества новых сообщений.

# — * — coding: utf-8 — *-django. template import
Librarydjango. db. models import QSA. user_profile. models import
Messagedjango. contrib. auth. models import User= Library ()

@register. filtermessages_count (obj):_am = User. objects.
get (pk = obj)= Message. objects. filter (recipient = i_am). filter (reader =
False). count ()messages

Файл views. py обрабатывающий страницу ДРУЗЬЯ и СООБЩЕНИЯ.

# — * — coding: utf-8 — *-SA. user_profile. models
import Profile, Message, Chatdjango. views. decorators. csrf import
csrf_exemptdjango. template import RequestContext # нужно чтобы передавать
реквест в контекст

from django. forms import ModelFormdjango. http import
HttpResponse, HttpResponseRedirectdjango import formsdjango. db. models import
Qdjango. shortcuts import render_to_response, redirectdjango. contrib. auth.
models import Userdatetimetime

# Передача на страницу формы поиска и осуществление самого
поиска.

# Вывод искомых пользователей

@csrf_exemptsearch_person (request):= Nonerequest. user.
is_authenticated ():ContactForm (forms. Form):_name = forms. CharField
(max_length=150, required=False)_name = forms. CharField (max_length=150,
required=False)= forms. CharField (max_length=150, required=False)_name =
forms. CharField (max_length=150, required=False)_user = request. user.
get_profilerequest. method == ‘POST’:= ContactForm (request. POST)= []form.
is_valid ():_name = form. cleaned_data [‘last_name’]_name = form. cleaned_data
[‘first_name’]_name = form. cleaned_data [‘midlle_name’]= form. cleaned_data
[‘user’]= {‘last_name__icontains’: last_name}. append (apply (Q, (), kargs)).
append (Q (first_name__icontains = first_name)). append (Q (midlle_name__icontains
= midlle_name)). append (Q (user__username__icontains = user))_result =
Profile. objects. filter (*params)= {‘form’: form, ‘search_result’:
search_result, ‘User’: current_user}render_to_response
(‘friends/search_person.html’, context, context_instance=RequestContext
(request)):= ContactForm ()= {‘form’: form, ‘User’:
current_user}render_to_response (‘friends/search_person.html’, context,
context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response
(«friends/error.html», {‘ErrorText’: u»Вы не
авторизированны»})

# Прохождение по ссылке «Добавить в
друзья»add_person (request, id):= Profile. objects. get (user = id)=
Profile. objects. get (user = request. user. get_profile). friends. add (obj).
friend_requests. add (user)HttpResponseRedirect (‘/friends/’)

# Прохождение по ссылке «Удалить друга»del_person
(request, id):= Profile. objects. get (user = id)= Profile. objects. get (user
= request. user. get_profile). friends. remove (obj)HttpResponseRedirect
(‘/friends/’)

#Прохождение по ссылке «Принять друга»accept_friend
(request, objid):= Profile. objects. get (user= request. user.
get_profile)_friend = Profile. objects. get (user = objid). friends. add (obj_friend).
friend_requests. remove (obj_friend)HttpResponseRedirect (‘/friends/’)

# Прохождение по ссылке отклонить другаreject_friend
(request, objid):= Profile. objects. get (user = request. user.
get_profile)_friend = Profile. objects. get (user = objid). friend_requests.
remove (obj_friend)HttpResponseRedirect (‘/friends/’)

# Вывод всех друзей

@csrf_exemptmy_friends (request):= Nonerequest. user.
is_authenticated ():= User. objects. all ()request. method == ‘POST’:=
{‘friends’: friends}render_to_response (‘friends/choice_friend.html’, context,
context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response
(«friends/error.html», {‘ErrorText’: u»Вы не авторизированны»})

# Вывод объектов моделей Chat и Message

@csrf_exemptall_message (request):= Nonerequest. user.
is_authenticated ():_am = User. objects. get (pk = request. user. id)= Q
(person2 = i_am)= Q (person1 = i_am)_friend = Chat. objects. filter (temp4 |
temp5) #person1 = request. user. username or person2 = request. user.
username)

i_am = User. objects. get (pk = request. user. id)= Message.
objects. filter (recipient = i_am). filter (reader = False). count ()=
all_friend

#Передаем в шаблон объект чата, что бы определить
каким цветом обозначать собеседника
= {‘all_friend’: all_friend, ‘messages’:
messages, ‘image’: image}render_to_response (‘friends/all_message.html’,
context, context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response
(«friends/error.html», {‘ErrorText’: u»Вы не
авторизированны»})

# Вывод формы для отправки сообщения

@csrf_exemptsend_message (request, id):MessageForm (forms.
Form):= forms. CharField (max_length=350, required=False)= forms. CharField
(max_length=350, required=False, widget=forms. Textarea)

#Выбираем отправить личное сообщение, и
определяем в бд, что я — покупатель, а тот кому пишу письмо — продавец

friend = User. objects. get (pk = id)_am = User. objects. get
(pk = request. user. id)= Q (recipient = friend) & Q (sender = i_am)= Q
(recipient = i_am) & Q (sender = friend)= temp1 | temp2= Q (person2 = i_am)
& Q (person1 = friend)= Q (person1 = i_am) & Q (person2 = friend)

#Выбрали — отправить личное сообщение, и
определяем в бд, что я — person1 и покупатель, а тот кому пишу письмо — person2
и продавец

if len (Chat. objects. filter (temp4 | temp5)) == 0:= Chat
(). person1 = i_am. person2 = friend. save ():request. method == ‘POST’:_message
= Message. objects. filter (temp3). order_by (‘date’)_obj = Chat. objects. get
(temp4 | temp5)= MessageForm (request. POST)form. is_valid ():= form.
cleaned_data [‘title’]= form. cleaned_data [‘message’]_message = Message
()_message. recipient = friend_message. sender = i_am_message. date = datetime.
datetime. now ()_message. title = title_message. message = message

#for elem in send_message:

send_message. reader = False_message. save ()_obj. messages.
add (send_message)_obj. save ()redirect (‘/myfriends/sendmessage/’+ str (id) +
‘/’):_message = Message. objects. filter (temp3). order_by (‘date’) [0:: 1]= Q
(person2 = i_am) & Q (person1 = friend)= Q (person1 = i_am) & Q
(person2 = friend)_type = Chat. objects. filter (temp4 | temp5)= MessageForm ()

#Если чувак открыл весь чат, то это значит, что
он все сообщения уже прочел

# Которые находятся в переписке => они все
устанавливаются в false
= Message. objects. filter (temp2)elem in send:not elem.
reader:. reader=True. save ()= {‘form’: form, ‘friend’: friend, ‘all_message’:
all_message}render_to_response (‘friends/send_message.html’, context,
context_instance=RequestContext (request))

Шаблон error.html для тех кто не зарегестрировался.

{% extends «main.html» %}

{% block main %}

<div>

<h2>Ошибка</h2>

{{ErrorText|safe}}

</div>

{% endblock %}

Шаблон search_person.html для вывода поисковой формы и всех
добавленных или тех кто хочет добавиться в друзья

{% extends «main.html» %}

{% block main %}

<div>

<h1>Поиск друзей</h1>

<form action=»» method=»post»>

<p>

<p>

<p>

<p>

<input>

{% for obj in search_result %}

{% if User! = obj %}

<p>{{ obj. last_name }} {{obj. first_name}} {{obj.
midlle_name}} {{ obj. user }}</p>

{% if obj in User. friends. all %}

<p>Уже ваш друг! </p>

{% else %}

<p><a>

{% endif %}

{% endif %}

{% endfor %}

{% if User. friends. all %}

<h2>Мои друзья: </h2>

{% for elem in User. friends. all %}

<p>{{ elem }}</p>

<p><a>

<p><a>

{% endfor %}

{% endif %}

{% if User. friend_requests. all %}

<h2>К вам хотят добавиться: </h2>

{% for obj in User. friend_requests. all %}

<p>{{ obj }}</p>

<p><a>

<p><a>

{% endfor %}

{% endif %}

</form>

</div>

{% endblock %}

Шаблон all_message.html для вывода всех сообщений

{% extends «main.html» %}

{% block main %}

<form action=»» method=»post»>

<table>

<tr>

<td colspan=»2″>Сообщения</td>

</tr>

{% for elem in all_friend %}

<tr>

<td>

<a href=»/myfriends/sendmessage/{% if request. user.
id == elem. person1. id %}{{elem. person2. id}}{% else %}

{{elem. person1. id}}{% endif %}/»>

{% if request. user. id == elem. person1. id %}

{% if elem. person2. thumbnail == «» %}

<img src=»/media/images/default. png»/>

{% else %}

<img id=»img-{{ elem. person2. get_min_thumbnail
}}» src=»{{ elem. person2. get_min_thumbnail }}»/>

{% endif %}

{% else %}

{% if elem. person1. thumbnail == «» %}

<img src=»/media/images/default. png»/>

{% else %}

<img id=»img-{{ elem. person1. get_min_thumbnail
}}» src=»{{ elem. person1. get_min_thumbnail }}»/>

{% endif %}

{%endif%}

{% if user. id == elem. person2. id %}

<p>{{ elem. person1 }}</p>

{% else %}

<p>{{ elem. person2 }}</p>

{% endif %}

<div>{{ elem. last_message. date }}</div>

</a>

</td>

<td>

<a href=»/myfriends/sendmessage/{% if request. user.
id == elem. person1. id %}{{elem. person2. id}}{% else %}

{{elem. person1. id}}{% endif %}/»>

<p>{{ elem. last_message. message|truncatechars: 80
}}</p>

</a>

</td>

</tr>

{% endfor %}

</table>

</form>

{% endblock %}

Шаблон send_message.html, для вывода всего чата и формы для
отправки нового сообщения.

{% extends «main.html» %}

{% block main %}

<div>

<form action=»» method=»post»>

<table>

<tr>

<td>История сообщений</td>

</tr>

{% for elem in all_message %}

{% if elem. reader %}

<tr bgcolor=»#F8F8FF»>

{% else %}

<tr bgcolor=»#B2DFEE»>

{% endif %}

<td>

<div>{{ elem. date }}</div>

<b>

{{ elem. sender }}

<br />

{{ elem. title }}

</b>

<p>{{ elem. message }}</p>

</td>

</tr>

{% endfor %}

</table>

<p>Кому: {{ friend. username }}</p>

<p>Заголовок: </p>

<div>{{ form. title }}</div>

<p>Сообщение: </p>

<div>{{ form. message }}</div>

<input>

</form>

</div>

{% block right %}

{% endblock %}

{% endblock %}

Модель приложения НОВОСТИ models. py

# — * — coding: utf-8 — *-django. db import
modelsdjango. contrib. auth. models import UserdatetimeComment (models.
Model):= models. CharField (max_length=350,verbose_name=u’Имя отправителя
комментария’,blank=True)= models. EmailField
(max_length=350,verbose_name=u’E-mail’,blank=True)= models. URLField
(max_length=350,verbose_name=u’Адрес сайта’,blank=True, verify_exists=False)=
models. TextField (verbose_name=u’Комментарий’, blank=True)Rubrics (models.
Model):= models. CharField (max_length=350,verbose_name=u’Заголовок
рубрики’,blank=True)= models. CharField (max_length=350, verbose_name=u’Перевод
на английский’)__unicode__ (self):self. titleBlog (models. Model):= models. CharField
(max_length=350,verbose_name=u’Заголовок новости’,blank=True)_before = models.
TextField (verbose_name=u’Начало новости’, blank=True)_after = models.
TextField (verbose_name=u’Окончание новости’, blank=True)= models.
DateTimeField (verbose_name=u’Дата опубликования новости’,blank=True,
null=True, default = datetime. datetime. now)= models. ManyToManyField
(Rubrics, verbose_name=u’Рубрики’, related_name=’rubric’, blank=True,
null=True)= models. ManyToManyField (Comment, verbose_name=u’Комментарии’, related_name=’comments’,
blank=True, null=True)__unicode__ (self):self. title

Файл views. py для отображения данных на странице НОВОСТИ

# — * — coding: utf-8 — *-SA. blog. models import
Blog, Rubrics, Commentdjango. views. decorators. csrf import csrf_exemptdjango.
shortcuts import render_to_response, redirectdjango. template import
RequestContext # нужно чтобы передавать реквест в контекст

from django. forms import ModelFormdjango. http import
HttpResponse, HttpResponseRedirectdjango import formsdjango. db. models import
Qdjango. contrib. auth. models import Userdatetimetime

@csrf_exemptblog_views (request):

# выводим все новости= Nonerequest. user.
is_authenticated ():= Blog. objects. all ()= Rubrics. objects. all ()_obj =
[]obj in Blog. objects. dates (‘date’, ‘month’):_obj. append (obj. date)=
{‘news’: news, ‘rubric’: rubric, ‘date_obj’: date_obj }render_to_response
(«blog/blog.html», context, context_instance=RequestContext
(request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response
(«user_profile/error.html», {‘ErrorText’: u»Вы не
авторизированны»})

@csrf_exemptnew_news (request):

# выводим все новости= Nonerequest. user.
is_authenticated ():BlogForm (forms. Form):= forms. CharField (max_length=150,
required=False)_before = forms. CharField (max_length=350, required=False,
widget=forms. Textarea)_after = forms. CharField (max_length=350,
required=False, widget=forms. Textarea)request. method == ‘POST’:= BlogForm
(request. POST)form. is_valid ():= form. cleaned_data [‘title’]_before = form.
cleaned_data [‘text_before’]_after = form. cleaned_data [‘text_after’]= Blog
(). title = title. text_before = text_before. text_after = text_after. date =
datetime. datetime. now ()

#for elem in send_message:

new. save ()redirect (‘/blog/’):= BlogForm ()= {‘form’:
form}render_to_response (‘blog/new_news.html’, context,
context_instance=RequestContext (request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response
(«user_profile/error.html», {‘ErrorText’: u»Вы не
авторизированны»})

@csrf_exemptblog_sort (request, slug):= Blog. objects. filter
(rubrics__slug=slug)= Rubrics. objects. all ()_obj = []obj in Blog. objects.
dates (‘date’, ‘month’):_obj. append (obj. date)= {‘news’: news, ‘rubric’:
rubric, ‘date_obj’: date_obj}render_to_response («blog/blog.html»,
context, context_instance=RequestContext (request))

@csrf_exemptblog_sort_date (request, year, month):= Blog.
objects. filter (date__year=year). filter (date__month=month)= Rubrics.
objects. all ()_obj = []obj in Blog. objects. dates (‘date’, ‘month’):_obj.
append (obj. date)= {‘news’: news, ‘rubric’: rubric, ‘date_obj’:
date_obj}render_to_response («blog/blog.html», context, context_instance=RequestContext
(request))

@csrf_exemptblog_all_text (request, id):= Nonerequest. user.
is_authenticated ():CommentForm (forms. Form):_user = forms. CharField
(max_length=150, required=False, initial = request. user. username)= forms.
EmailField (max_length=150, initial=request. user. email)= forms. URLField
(max_length=150, required=False, verify_exists=False)= forms. CharField
(max_length=350, required=False, widget=forms. Textarea)_obj = []obj in Blog.
objects. dates (‘date’, ‘month’):_obj. append (obj. date)request. method ==
‘POST’:

# Выберем тот объект из модели Blog, которой
хотим отправить комментарий
_new = Blog. objects. get (id = id)= CommentForm (request.
POST)form. is_valid ():_user = form. cleaned_data [‘name_user’]= form.
cleaned_data [‘mail’]= form. cleaned_data [‘site’]= form. cleaned_data
[‘comment’]_comment = Comment ()_comment. name = name_user_comment. mail =
mail_comment. site = site_comment.comment = comment_comment. save ()

# Добавляем в новость которую мы сейчас
просматриваем новый комментарий
_new.comments. add (model_comment)_new. save
()redirect (‘/blog/blog_all_text/’+ str (id) + ‘/’):= CommentForm ()= Blog.
objects. get (id = id)= Rubrics. objects. all ()= {‘form’: form, ‘news’: news,
‘rubric’: rubric, ‘date_obj’: date_obj}render_to_response
(«blog/blog_all_text.html», context, context_instance=RequestContext
(request)):

# если не залогинен

# хорошо бы сделать из этой проверки декоратор,
чтоб всюду её не тоскать за собой
render_to_response («user_profile/error.html»,
{‘ErrorText’: u»Вы не авторизированны»})

Шаблон blog.html для главной страницы приложения НОВОСТИ

{% extends «main.html» %}

{% block main %}

<div>

<form action=»» method=»post»>

Архивы:

{% for obj in date_obj %}

<p><a>

{% endfor %}

<p>_________________________________________________________</p>

<table width=»100%» border=»0″
cellspacing=»0″ cellpadding=»4″>

{% for elem in news %}

<tr align=»center»
bgcolor=»#B2DFEE»><p> {{ elem. title }}
</p></tr>

<tr align=»center»>

<p> </p>

<p>{{ elem. text_before }}</p></tr>

<tr align=»center»>

<p><a>

</tr>

<tr align=»center»><p> {{ elem. date}}
</p></tr>

{% endfor %}

</table>

<a>

</form>

</div>

{% endblock %}

Шаблон blog_all_text.html для просмотра всего текста новости
и возможности написания комментария.

{% extends «main.html» %}

{% block main %}

<div>

<form action=»» method=»post»>

Архивы:

{% for obj in date_obj %}

<p><a>

{% endfor %}

<p>_________________________________________________________</p>

<table width=»100%» border=»0″
cellspacing=»0″ cellpadding=»4″>

<tr align=»center» bgcolor=»#B2DFEE»><p>
{{ news. title }} </p></tr>

<tr align=»center»>

<p> {{ news. text_before }} </p>

</tr>

<tr align=»center»>

<p> {{ news. text_after }} </p>

</tr>

<tr align=»center»><p> {{ news. date
}}</p></tr>

</table>

<table>

<tr>

<td colspan=»2″>Комментарии</td>

</tr>

{% for obj in news.comments. all %}

<tr>

<td align=»center»> {{ obj. name
}}</td>

<td> {{ obj.comment }}</td>

</tr>

{% endfor %}

</table>

<table>

<tr><td> Имя: {{ form. name_user
}}</td></tr>

<tr><td> Комментарии: {{ form.comment
}}</td></tr>

</table>

<input type=»submit»
value=»Отправить»>

</form>

</div>

{% endblock %}

Шаблон new_news.html для опубликования новой новости.

{% extends «main.html» %}

{% block main %}

<div>

<h2>Новая запись</h2>

<img src=»/media/images/default. png»/>

<form action=»» method=»post»>

<h4>Заголовок</h4>

<p>{{form. title. label}}{{form. title}}</p>

<h4>Первая часть новости</h4>

<p>{{form. text_before. label}}{{form.
text_before}}</p>

<h4>Вторая часть новости</h4>

<p>{{form. text_after. label}}{{form.
text_after}}</p>

</form>

</div>

{% endblock %}


С этим файлом связано 4 файл(ов). Среди них: Лекция №1-2.pptx, P361.docx, Слайд РГФТТР.pptx, Методичка1.docx.
Показать все связанные файлы


Подборка по базе: Урок математики с применением сингапурской технологии.docx, 4 фреймворки.docx, ПЗ № 23 Текстовый редактор назначение, основные функции.docx, 3.Дорожная карта по переходу с 1 сентября 2023 года к осуществл, Тема 4.3. Применение законов отражения и преломления для получен, Плямко_С_А Применение_СГКО+ПАВ.pptx, «Ручные пожарные лестницы. Назначение, устройство, правила экспл, «Ручные пожарные лестницы. Назначение, устройство, правила экспл, «Ручные пожарные лестницы. Назначение, устройство, правила экспл, Презентация по технологии на тему _Электромагниты и их применени


Министерство образования и науки

Кыргызской Республики

Бишкекский Технический Колледж

Курсовая Работа

По дисциплине: «Теория разработки программного продукта»

На тему: «Фреймворк Django. Назначение, применение в современной web — разработке»

Выполнил: Абдумалик уулу Чынгыз

Группа: 303-ПО-1

Проверил: Кумарбек уулу Кутман

Оценка_________

Содержание

Введение………………………………………………………………3

Установка среды разработки Django………………………………….7

Тестирование приложений Django…………………………………..10

Работа с формами……………………………………………………..13

Аутентификация и авторизация пользователей……………………..19

Сессии…………………………………………………………………25

Разворачивание сайта на сервере……………………………………29

Введение

Django (Джанго, [‘dʒæŋɡoʊ]) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.

Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Dontrepeatyourself)

Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.

Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.

Пример веб-приложения, которое показывает «Hello World!»:

1 from django.http import HttpResponse

2

3 def hello(request):

4 return HttpResponse(«Hello world»)

Django — это высокоуровневый Python веб-фреймворк, который позволяет быстро создавать безопасные и поддерживаемые веб-сайты. Созданный опытными разработчиками, Django берёт на себя большую часть хлопот веб-разработки, поэтому вы можете сосредоточиться на написании своего веб-приложения без необходимости изобретать велосипед. Он бесплатный и с открытым исходным кодом, имеет растущее и активное сообщество, отличную документацию и множество вариантов как бесплатной, так и платной поддержки.

Django помогает писать программное обеспечение, которое будет:

Полным

Django следует философии «Всё включено» и предоставляет почти всё, что разработчики могут захотеть сделать «из коробки». Поскольку всё, что вам нужно, является частью единого «продукта», всё это безупречно работает вместе, соответствует последовательным принципам проектирования и имеет обширную и актуальную документацию.

Разносторонним

Django может быть (и был) использован для создания практически любого типа веб-сайтов — от систем управления контентом и wiki до социальных сетей и новостных сайтов. Он может работать с любой клиентской средой и может доставлять контент практически в любом формате (включая HTML, RSS-каналы, JSON, XML и т. д.). Сайт, который вы сейчас читаете, создан с помощью Django!

Хотя Django предоставляет решения практически для любой функциональности, которая вам может понадобиться (например, для нескольких популярных баз данных, шаблонизаторов и т. д.), внутренне он также может быть расширен сторонними компонентами, если это необходимо.

Безопасным

Django помогает разработчикам избежать многих распространённых ошибок безопасности, предоставляя фреймворк, разработанный чтобы «делать правильные вещи» для автоматической защиты сайта. Например, Django предоставляет безопасный способ управления учётными записями пользователей и паролями, избегая распространённых ошибок, таких как размещение информации о сеансе в файлы cookie, где она уязвима (вместо этого файлы cookie содержат только ключ, а фактические данные хранятся в базе данных) или непосредственное хранение паролей вместо хэша пароля.

Хэш пароля  это значение фиксированной длины, созданное путём обработки пароля через криптографическую хэш-функцию. Django может проверить правильность введённого пароля, пропустив его через хэш-функцию и сравнив вывод с сохранённым значением хэша. Благодаря «одностороннему» характеру функции, даже если сохранённое хэш-значение скомпрометировано, злоумышленнику будет сложно определить исходный пароль.

Django, по умолчанию, обеспечивает защиту от многих уязвимостей, включая SQL-инъекцию, межсайтовый скриптинг, подделку межсайтовых запросов и кликджекинг (см. Website security для получения дополнительной информации об этих атаках).

Масштабируемым

Django использует компонентную “shared-nothing” архитектуру (каждая её часть независима от других и, следовательно, может быть заменена или изменена, если это необходимо). Чёткое разделение частей означает, что Django может масштабироваться при увеличении трафика, путём добавления оборудования на любом уровне: серверы кеширования, серверы баз данных или серверы приложений. Одни из самых загруженных сайтов успешно масштабировали Django (например, Instagram и Disqus, если назвать только два из них).

Удобным в сопровождении

Код Django написан с использованием принципов и шаблонов проектирования, которые поощряют создание поддерживаемого и повторно используемого кода. В частности, в нём используется принцип «Don’t Repeat Yourself» (DRY, «не повторяйся»), поэтому нет ненужного дублирования, что сокращает объём кода. Django также способствует группированию связанных функциональных возможностей в повторно используемые «приложения» и, на более низком уровне, группирует связанный код в модули (в соответствии с шаблоном Model View Controller (MVC)).

Переносным

Django написан на Python, который работает на многих платформах. Это означает, что вы не привязаны к какой-либо конкретной серверной платформе и можете запускать приложения на многих версиях Linux, Windows и Mac OS X. Кроме того, Django хорошо поддерживается многими веб-хостингами, которые часто предоставляют определённую инфраструктуру и документацию для размещения сайтов Django.

Установка среды разработки Django

Django упрощает настройку собственного компьютера, чтобы вы могли начать разработку веб-приложений. В этом разделе объясняется, что входит в состав среды разработки, и даётся обзор некоторых параметров настройки и конфигурации. В оставшейся части статьи объясняется рекомендуемый метод установки среды разработки Django на Ubuntu, Mac OS X и Windows, и как вы можете её протестировать.

Среда разработки — это установка Django на вашем локальном компьютере, которую вы можете использовать для разработки и тестирования приложений Django до их развёртывания в производственной среде.Основными инструментами, которые предоставляет сам Django, является набор скриптов Python для создания и работы с проектами Django, а также простой веб-сервер разработки, который можно использовать для тестирования локальных (то есть на вашем компьютере, а не на внешнем веб-сервере) веб-приложений Django на веб-браузере вашего компьютера.Существуют и другие периферийные инструменты, являющиеся частью среды разработки, которые мы не будем освещать здесь. К ним относятся такие вещи, как текстовый редактор или IDE для редактирования кода, и инструмент управления исходным кодом, например Git, для безопасного управления различными версиями вашего кода. Мы предполагаем, что у вас уже установлен текстовый редактор.

Django очень гибок с точки зрения способа и места установки и настройки. Django может быть:

  • установлен на различных операционных системах,
  • установлен из исходного кода, из Python Package Index (PyPi) и во многих случаях из любого менеджера пакетов,
  • настроен на использование различных баз данных, которые должны быть установлены и настроены отдельно,
  • запущен в основной системе окружения Python или в отдельном виртуальном окружении Python.

Каждый из этих вариантов требует немного разной настройки и установки. Следующие подразделы объяснят некоторые аспекты вашего выбора. Далее мы покажем вам, как установить Django на некоторые операционные системы, и эта установка будет предполагаться на всём протяжении данного модуля.

Для загрузки Django можно воспользоваться 3 источниками:

  • The Python Package Repository (PyPi), при помощи инструмента pip. Это лучший способ получения последней стабильной версии Django.
  • Использование версии из менеджера пакетов вашего компьютера. Такие дистрибутивы Django, собранные для конкретных операционных систем, предлагают знакомый механизм установки. Однако обратите внимание на то, что пакетные версии могут быть достаточно старыми и установлены только в системную среду Python (что может отличаться от ваших желаний).
  • Установка из исходного кода. Вы можете получить и установить последний выпуск Django из исходного кода. Этот способ не рекомендован для новичков, но необходим в случае, когда вы готовы начать вносить собственный вклад в проект Django.

Данный материал описывает способ установки Django из PyPi с целью получения последней стабильной версии.

Веб-приложения Django можно запускать почти на любых машинах, которые поддерживают язык программирования Python 3, среди прочих: Windows, Mac OS X, Linux/Unix, Solaris. Почти любой компьютер имеет необходимую производительность для запуска Django во время разработки.

Django поддерживает 4 основных базы данных (PostgreSQL, MySQL, Oracle и SQLite), также есть публичные библиотеки, которые предоставляют разные уровни поддержки других SQL и NoSQL баз данных. Мы рекомендуем вам выбрать одинаковую БД для обеих рабочей и разрабатываемой сред (несмотря на  то, что Django нивелирует множество различий баз данных при помощи Object-Relational Mapper (ORM), всё равно возможны потенциальные проблемы, которых лучше избегать.

Django сконфигурирован для использования SQLite по умолчанию, при создании вашего проекта с использованием стандартных инструментов (django-admin). Это отличный выбор для начала работы, потому что он не требует дополнительной настройки.

Тестирование приложений Django

Сайты, в процессе развития и разработки, становится все сложнее тестировать вручную. Кроме такого тестирования, сложными становятся внутренние взаимодействия между компонентами — внесение небольшого изменения в одной части приложения влияет на другие. При этом, чтобы все продолжало работать нужно вносить все больше и больше изменений и, желательно так, чтобы не добавлялись новые ошибки. Одним из способов который позволяет смягчить последствия добавления изменений, является внедрение в разработку автоматического тестирования — оно должно просто и надёжно запускаться каждый раз, когда вы вносите изменения в свой код. Данное руководство рассматривает вопросы автоматизации юнит-тестирования вашего сайта при помощи фреймворка Django для тестов.

Существует несколько типов, уровней, классификаций тестов и тестовых приёмов. Наиболее важными автоматическими тестами являются:

Юнит-тесты

Проверяют функциональное поведение для отдельных компонентов, часто классов и функций.

Регрессионное тестирование

Тесты которые воспроизводят исторические ошибки (баги). Каждый тест вначале запускается для проверки того, что баг был исправлен, а затем перезапускается для того, чтобы убедиться, что он не был внесён снова с появлением новых изменений в коде.

Интеграционные тесты

Проверка совместной работы групп компонентов. Данные тесты отвечают за совместную работу между компонентами, не обращая внимания на внутренние процессы в компонентах. Они проводятся как для простых групп компонентов, так и для целых веб-сайтов.

Тестирование сайта это сложная задача, потому что она состоит их нескольких логических слоёв – от HTTP-запроса и запроса к моделям, до валидации формы и их обработки, а кроме того, рендеринга шаблонов страниц.

Django предоставляет фреймворк для создания тестов, построенного на основе иерархии классов, которые, в свою очередь, зависят от стандартной библиотеки Python  unittest. Несмотря на название, данный фреймворк подходит и для юнит-, и для интеграционного тестирования. Фреймворк Django добавляет методы API и инструменты, которые помогают тестировать как веб так и, специфическое для Django, поведение. Это позволяет вам имитировать URL-запросы, добавление тестовых данных, а также проводить проверку выходных данных ваших приложений. Кроме того, Django предоставляет API (LiveServerTestCase) и инструменты для применения различных фреймворков тестирования, например вы можете подключить популярный фреймворк Selenium для имитации поведения пользователя в реальном браузере.

Для написания теста вы должны наследоваться от любого из классов тестирования Django (или юниттеста) (SimpleTestCase, TransactionTestCase, TestCase, LiveServerTestCase), а затем реализовать отдельные методы проверки кода (тесты это функции-«утверждения», которые проверяют, что результатом выражения являются значения True или False, или что два значения равны и так далее). Когда вы запускаете тест, фреймворк выполняет соответствующие тестовые методы в вашем классе-наследнике. Методы тестирования запускаются независимо друг от друга, начиная с метода настроек и/или завершаясь методом разрушения (tear-down), определённом в классе, как показано ниже.

class YourTestClass(TestCase):

def setUp(self):

# Установки запускаются перед каждым тестом

pass

def tearDown(self):

# Очистка после каждого метода

pass

def test_something_that_will_pass(self):

self.assertFalse(False)

def test_something_that_will_fail(self):

self.assertTrue(False)

Copy to Clipboard

Самый подходящий базовый класс для большинства тестов это django.test.TestCase.  Этот класс создаёт чистую базу данных перед запуском своих методов, а также запускает каждую функцию тестирования в его собственной транзакции. У данного класса также имеется тестовый Клиент, который вы можете использовать для имитации взаимодействия пользователя с кодом на уровне отображения. 

Работа с формами

HTML форма — это группа из одного или нескольких полей/виджетов на веб-странице, которая используется для сбора информации от пользователей для последующей отправки на сервер. Формы являются гибким механизмом сбора пользовательских данных, поскольку имеют целый набор виджетов для ввода различных типов данных, как то: текстовые поля, флажки, переключатели, установщики дат и т. д. Формы являются относительно безопасным способом взаимодействия пользовательского клиента и сервера, поскольку они позволяют отправлять данные в POST-запросах, применяя защиту от Межсайтовой подделки запроса (Cross Site Request ForgeryCSRF)

Работа с формами может быть достаточно сложной! Разработчикам надо описать форму на HTML, проверить её валидность, а также, на стороне сервера, проверять введённые пользователем данные (а возможно и на стороне клиента), далее, в случае возникновения ошибок необходимо опять показать пользователю форму и, при этом, указать на то, что пошло не так, в случае же успеха проделать с данными необходимые операции и каким-то образом проинформировать об этом пользователя. Django, при работе с формами, берёт большую часть, описанной выше работы, на себя. Он предоставляет фреймворк, который позволяет вам определять форму и её поля программно, а затем использовать эти объекты и для генерации непосредственно кода HTML-формы, и для контроля за процессом валидации и других пользовательский взаимодействий с формой.

Начнём мы с краткого обзора Форм HTML. Рассмотрим простую форму HTML, имеющую поле для ввода имени некоторой «команды» («team»), и, связанную с данным полем, текстовой меткой:

Форма описывается на языке HTML как набор элементов, расположенных внутри парных тэгов . Любая форма содержит как минимум одно поле-тэг input типа type=»submit».

<form action/team_name_url/« methodpost«>

<label forteam_name«>Enter name: label>

<input idteam_name« typetext« namename_field« valueDefault name for team.«>

<input typesubmit« valueOK«>

form>

Здесь у нас только одно поле для ввода имени команды, но форма может иметь любое количество элементов ввода и, связанных с ними, текстовых меток. Атрибут элемента type определяет какого типа виджет будет показан в данной строке. Атрибуты name и  id используются для однозначной идентификации данного поля в JavaScript/CSS/HTML, в то время как value содержит значение для поля (когда оно показывается в первый раз). Текстовая метка добавляется при помощи тэга label (смотрите «Enter name», в предыдущем фрагменте) и имеет атрибут for со значением идентификатора id, того поля, с которым данная текстовая метка связана.

Элемент input  с  type=»submit» будет показана как кнопка (по умолчанию), нажав на которую, пользователь отправляет введённые им данные на сервер (в данном случае только значение поля с идентификатором team_name). Атрибуты формы определяют каким методом будут отправлены данные на сервер (атрибут method) и куда  (атрибут action):

  • action: Это ресурс/URL-адрес куда будут отправлены данные для обработки. Если значение не установлено (то есть, значением поля является пустая строка), тогда данные будут отправлены в отображение (функцию, или класс), которое сформировало текущую страницу.
  • method: HTTP-метод, используемый для отправки данных: post, или get.
    • Метод POST должен всегда использоваться если отправка данных приведёт к внесению изменений в базе данных на сервере. Применение данного метода должно повысить уровень защиты от CSRF.
    • Метод GET должен применяться только для форм, действия с которыми не приводят к изменению базы данных (например для поисковых запросов). Кроме того, данный метод рекомендуется применять для создания внешних ссылок на ресурсы сайта.

Ролью сервера в первую очередь является отрисовка начального состояния формы — либо содержащей пустые поля, либо с установленными начальными значениями. После того как пользователь нажмёт на кнопку,  сервер получит все данные формы, а затем должен провести их валидацию. В том случае, если форма содержит неверные данные, сервер должен снова отрисовать форму, показав при этом поля с правильными данными, а также сообщения, описывающие «что именно пошло не так». В тот момент, когда сервер получит запрос с «правильными» данными он должен выполнить все необходимые действия (например, сохранение данных, возврат результата поиска, загрузка файла и тому подобное), а затем, в случае необходимости, проинформировать пользователя.

Управление формами в Django использует те же самые техники, которые мы изучали в предыдущих частях руководства (при показе информации из наших моделей): отображение получает запрос, выполняет необходимые действия, включающие в себя чтение данных из моделей, генерацию и возврат страницы HTML (из шаблона, в который передаётся контекст, содержащий данные, которые и будут показаны). Что делает данный процесс более сложным, так это то, что серверной части надо дополнительно обработать данные, предоставленные пользователем и, в случае возникновения ошибок, снова перерисовать страницу.

Диаграмма, представленная ниже, демонстрирует процесс работы с формой в Django, начиная с запроса страницы, содержащей форму (выделено зелёным цветом).

В соответствии с данной диаграммой, главными моментами, которые берут на себя формы Django являются:

  1. Показ формы по умолчанию при первом запросе со стороны пользователя.
    • Форма может содержать пустые поля (например, если вы создаёте новую запись в базе данных), или они (поля) могут иметь начальные значения (например, если вы изменяете запись, или хотите заполнить её каким-либо начальным значением).
    • Форма в данный момент является несвязанной, потому что она не ассоциируется с какими-либо введёнными пользователем данными (хотя и может иметь начальные значения).
  2. Получение данных из формы (из HTML-формы) со стороны клиента и связывание их с формой (классом формы) на стороне сервера.
    • Связывание данных с формой означает, что данные, введённые пользователем, а также возможные ошибки, при переотрисовке в дальнейшем, будут относиться именно к данной форме, а не к какой-либо ещё.
  3. Очистка и валидация данных.
    • Очистка данных — это их проверка на наличие возможных значений, или вставок в поля ввода (то есть очистка — это удаление неправильных символов, которые потенциально могут использоваться для отправки вредоносного содержимого на сервер), с последующей конвертацией очищенных данных в подходящие типы данных Python.
    • Валидация проверяет, значения полей (например, правильность введённых дат, их диапазон и так далее)
  4. Если какие-либо данные являются неверными, то выполнение перерисовки формы, но на этот раз, с уже введёнными пользователем данными и сообщениями об ошибках, описывающих возникшие проблемы.
  5. Если все данные верны, то исполнение необходимых действий (например, сохранение данных, отправка писем, возврат результата поиска, загрузка файла и так далее)
  6. Когда все действия были успешно завершены, то перенаправление пользователя на другую страницу.

Класс Form является сердцем системы Django при работе с формами. Он определяет поля формы, их расположение, показ виджетов, текстовых меток, начальных значений, валидацию значений и сообщения об ошибках для «неправильных» полей (если таковые имеются). Данный класс, кроме того, предоставляет методы для отрисовки самого себя в шаблоне при помощи предопределённых форматов (таблицы, списки и так далее), или для получения значения любого элемента (позволяя выполнять более точную отрисовку).

Синтаксис объявления для класса формы Form очень похож на объявление класса модели Model, он даже использует те же типы полей (и некоторые похожие параметры). Это существенный момент, поскольку в обоих случаях нам надо убедиться, что каждое поле управляет правильным типом данных, соответствует нужному диапазону (или другому критерию) и имеет необходимое описание для показа/документации.

Аутентификация и авторизация пользователей
Система аутентификации и авторизации позволяет вам проверять учётные данные пользователей и определять какие действия какой пользователь может выполнять. Данный фреймворк включает в себя встроенные модели для Пользователей и Групп (основной способ применения прав доступа для более чем одного пользователя), непосредственно саму систему прав доступа (permissions)/флаги, которые определяют может ли пользователь выполнить задачу, с какой формой и отображением для авторизованных пользователей, а так же получить доступ к контенту с ограниченным доступом.

В соответствии с идеологией Django система аутентификации является очень общей и, таким образом, не предоставляет некоторые возможности, которые присутствуют в других системах веб-аутентификации. Решениями некоторых общих задач занимаются пакеты сторонних разработчиков, например, защита от подбора пароля (через стороннюю библиотеку OAuth).

Система аутентификации является очень гибкой и позволяет вам формировать свои собственные URL-адреса, формы, отображения, а также шаблоны страниц, если вы пожелаете, с нуля, через простой вызов функций соответствующего API для авторизации пользователя. Тем не менее, в данной статье мы будем использовать «встроенные» в Django методы отображений и форм аутентификации, а также методы построения страниц входа и выхода.

вы можете создавать пользователей программно, как показано ниже. Например, вам мог бы подойти данный способ в том случае, если вы разрабатываете интерфейс, который позволяет пользователям создавать их собственные аккаунты (вы не должны предоставлять доступ пользователям к административной панели вашего сайта).

from django.contrib.auth.models import User

# Создайте пользователя и сохраните его в базе данных

user = User.objects.create_user(‘myusername’, ‘myemail@crazymail.com’, ‘mypassword’)

# Обновите поля и сохраните их снова

user.first_name = ‘John’

user.last_name = ‘Citizen’

user.save()

Ниже мы создадим группу, а затем пользователя. Несмотря на то, что у нас пока нет никаких  разрешений для добавления к нашей библиотеке каких-либо членов, если мы захотим это сделать в будущем, то будет намного проще добавлять их к уже созданной группе, с заданной аутентификацией.

Запустите сервер разработки и перейдите к административной панели вашего сайта (http://127.0.0.1:8000/admin/). Залогиньтесь на сайте при помощи параметров (имя пользователя и пароля) аккаунта суперпользователя. Самая «верхняя» страница панели Администратора показывает все наши модели. Для того, чтобы увидеть записи в разделе  вы можете нажать на ссылку Users, или Groups.

В первую очередь, в качестве нового члена нашего сайта, давайте создадим новую группу.

  1. Нажмите на кнопку Add (Добавить) (рядом с Group) и создайте новую группу; для данной группы введите Name (Имя) «Library Members».
  2. Для данной группы не нужны какие-либо разрешения, поэтому мы просто нажимаем кнопку SAVE (Сохранить) (вы перейдёте к списку групп).

Теперь давайте создадим пользователя:

  1. Перейдите обратно на домашнюю страницу административной панели
  2. Для перехода к диалогу добавления пользователя нажмите на кнопку Add, соответствующую строке Users (Пользователи).
  3. Введите соответствующие Username (имя пользователя) и Password/Password confirmation (пароль/подтверждение пароля) для вашего тестового пользователя
  4. Нажмите SAVE для завершения процесса создания пользователя.

    Административная часть сайта создаст нового пользователя и немедленно перенаправит вас на страницу 

    Change user (Изменение параметров пользователя) где вы можете, соответственно, изменить ваш username, а кроме того добавить информацию для дополнительных полей модели User. Эти поля включают в себя имя пользователя, фамилию, адрес электронной почты, статус пользователя, а также соответствующие параметры доступа (может быть установлен только флаг  Active). Ниже вы можете определить группу для пользователя и необходимые параметры доступа, а кроме того, вы можете увидеть важные даты, относящиеся к пользователю (дату подключения к сайту и дату последнего входа).

Django предоставляет почти все, что нужно для создания страниц аутентификации входа, выхода из системы и управления паролями из коробки. Это включает в себя url-адреса, представления (views) и формы,но не включает шаблоны — мы должны создать свой собственный шаблон!

Система сброса пароля по умолчанию использует электронную почту, чтобы отправить пользователю ссылку на сброс. Вам необходимо создать формы, чтобы получить адрес электронной почты пользователя, отправить электронное письмо, разрешить им вводить новый пароль и отметить, когда весь процесс будет завершён.В качестве отправной точки можно использовать следующие шаблоны.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

1
branch

1
tag


Code

  • Use Git or checkout with SVN using the web URL.

  • Open with GitHub Desktop

  • Download ZIP

Latest commit

Files

Permalink

Failed to load latest commit information.

Type

Name

Latest commit message

Commit time

Установка и настройка

  • Установить Python 3.5.1
    (для debian: apt-get install python3-pip)

  • Установить фреймворк Django (cmd из-под админа):
    pip install django
    (для debian: pip3 ...)

  • Перейти в папку проекта и инициализировать приложение:
    django-admin startproject mysite .

  • Поправить время и папку статичных файлов в mysite/settings.py:

    TIME_ZONE = 'Europe/Moscow'
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
  • Создать БД по-умолчанию:
    python manage.py migrate
    (в debian здесь и далее команда: python3 ...)

  • Проверить работу запуском:
    python manage.py runserver
    и зайти на: http://localhost:8000/admin/login/

  • Создаем новое приложение:
    python manage.py startapp dashboard
    и добавить в mysite/settings.py в список INSTALLED_APPS:

  • После создания модели определяем миграцию:
    python manage.py makemigrations dashboard
    и накатываем её:
    python manage.py migrate dashboard

  • Добавляем работу с таблицей в админку, дописывая в файл dashboard/admin.py:

    from .models import КлассМодели
    admin.site.register(КлассМодели)
  • Создаем юзера:
    python manage.py createsuperuser
    (в админке, если надо залогиниваться под определенным пользователем, то ставим ему «статус персонала» в «Пользователи и группы» > «Пользователи«)

Запуск на продакшене

screen

python3 manage.py runserver romanov-vrn.ru:8000

Ctrl+A D — выйти из консоли в систему

screen -r - вернуться в консоль

Ctrl+A K — убить консоль

С момента основания сети интернет количество пользователей неуклонно увеличивается большими шагами. Большая доля населения имеет у себя дома или на работе выход к его ресурсам. Возникает необходимость использования этого направления в информационных целях. Интернет дает прекрасную возможность фокусировать воздействие на конкретную узко профильную, целевую аудиторию, в которой заинтересована организация.

СОДЕРЖАНИЕ

Введение

1. Анализ существующих систем для разработки сайта

.1   Статический сайт

1.2    Динамический сайт

1.3    PHP

1.4    Ruby

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

1.5    Python

1.6    Joomla

1.7    Ruby on Rails

1.8    Django

2. Разработка технических требований и постановка задач выпускной квалификационной работы

. Архитектура и структура сайта на фреймворке Django

.1 Архитектура Django

.2 Структура Django

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

.3 Структура сайта

. Выбор базы данных для сайта

.1 SQLite

.2 PostgreSQL

.3 MySQL

.4 Oracle

. Разработка приложения для сайта

. Разработка приложения авторизации для просмотра закрытых научных проектов центра

. Тестирование сайта

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

.1 Конфигурационное тестирование

.2 Верность HTML кода

.3 Функциональное тестирование

.4 Тестирование безопасности

. Разработка документации для администратора сайта

Заключение

Список использованных источников

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

ВВЕДЕНИЕ

С момента основания сети интернет количество пользователей неуклонно увеличивается большими шагами. Большая доля населения имеет у себя дома или на работе выход к его ресурсам. Возникает необходимость использования этого направления в информационных целях. Интернет дает прекрасную возможность фокусировать воздействие на конкретную узко профильную, целевую аудиторию, в которой заинтересована организация. Предрасположенность пользователей интернета к получению информации способствует к её более позитивному восприятию и высокой усвояемости.

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

Исходя из этого, темой выпускной квалификационной работы было выбрано создание сайта для научно-образовательного центра «Интеллектика».

Научно-образовательный центр (далее — НОЦ) создан на базе сложившейся системы подготовки специалистов и поисковых научных исследований в области создания и изучения систем и технологий интеллектуализации в рамках научных школ Федерального государственного образовательного учреждения высшего профессионального образования «Вологодский государственный университет <#»897347.files/image001.jpg»>

Рисунок 3.1 — Архитектура Django

.1 Архитектура Django

Архитектура Django состоит из четырех основных компонентов:

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

1)    модель данных являются сердцевиной любого современного веб-приложения. Модель — это важнейшая часть приложения, которое постоянно обращается к данным при любом запросе из любой сессии. Любая модель является стандартным Python классом. Объектно-ориентированный mapper (ORM) обеспечивает таким классам доступ непосредственно к базам данных. Если бы не было ORM, пришлось бы писать запросы непосредственно на SQL. Модель обеспечивает облегченный механизм доступа к слою данных, инкапсулирует бизнес-логику. Модель не зависит от конкретного приложения. Данными можно манипулировать даже из командной строки, не используя при этом веб-сервер;

2)      представление выполняют разнообразные функции, в том числе контролируют запросы пользователя, выдают контекст в зависимости от его роли. View — это обычная функция, которая вызывается в ответ на запрос какого-то адреса (URL) и возвращает контекст;

)        шаблоны являются формой представления данных. Шаблоны имеют свой собственный простой метаязык и являются одним из основных средств вывода на экран;

)        URL механизм внешнего доступа к представлениям (view). Встроенные в URL регулярные выражения делают механизм достаточно гибким. При этом одно представление может быть сконфигурировано к нескольким URL, предоставляя доступ различным приложениям. Здесь поддерживается философия закладок: URL становятся самодостаточными и начинают жить независимо от представления.

В дистрибутив Django также включены приложения для системы комментариев, синдикации RSS <#»897347.files/image002.jpg»>

Рисунок 3.2 — Структура сайта

4. Выбор базы данных для сайта

Существует масса различных баз данных, которые можно использовать для нужд Django, и каждая из них требует наличия как самого программного обеспечения, реализующего базу данных, так и библиотеки для языка Python, которая обеспечит взаимодействие с ней.   .1 SQLite

Название SQLite говорит само за себя — это «легковесная» реализация базы данных SQL. В отличие от PostgreSQL, MySQL и многих коммерческих баз данных, таких как Oracle или MS SQL, база данных SQLite не является самостоятельным сервером, это просто библиотека, реализующая интерфейс доступа к дисковым файлам базы данных. Как и другие «легковесные» реализации типично сложных служб.

Преимущество SQLite:

)      простота в настройке и использовании;

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

2)      низкая нагрузка на сервер.

Недостатки SQLite:

)      недостаточная функциональность;

2)      невысокая производительность при работе с большими объемами данных.

Вследствие всего этого SQLite прекрасно подходит для быстрого запуска процесса разработки или для маленьких сайтов, где нет необходимости устанавливать полноценный веб-сервер баз данных. Однако, после этапа начального обучения, а также для более серьезных случаев развертывания необходимо будет приобрести нечто более существенное.

Чтобы иметь возможность взаимодействовать с базой данных SQLite, потребуется библиотека для языка Python. Используя Python 2.7, в нашем распоряжении имеется встроенный модуль sqlite3.

В отличие от серверов баз данных, описываемых ниже, SQLite не требует явного создания базы данных или механизма управления пользователями. Вместо этого просто выбирается каталог в файловой системе для базы данных (один из тех, что доступен веб-серверу для чтения и записи) и его имя записывается в виде параметра DATABASES в файле settings.py. После этого в указанном каталоге будет создан файл базы данных при обычном использовании утилиты manage.py.   .2 PostgreSQL

(часто это название сокращают до «Postgres») — это полноценный веб-сервер баз данных, обладающий широким спектром функциональных возможностей и давней историей развития, который является одним из ведущих приложений баз данных, распространяемых с открытыми исходными текстами. Эта база данных рекомендуется к использованию основными разработчиками Django, которые дают весьма высокие оценки ее качеству.

Чтобы иметь возможность взаимодействовать с базой данных Postgres из программного кода на языке Python, нам потребуется библиотека psycopg2.

Создание баз данных и пользователей в Postgres выполняется достаточно просто, в состав Postgres по умолчанию входят отдельные утилиты командной строки, такие как createuser и createdb, названия которых говорят сами за себя. Как только мы узнаем имя суперпользователя и пароль, мы сможем выполнить следующий пример и настроить базу данных и добавить пользователя для вашего проекта на платформе Django:

$ createuser -P django_userpassword for new role:it again:the new role be a superuser? (y/n) nthe new role be allowed to create databases? (y/n) ythe new role be allowed to create more new roles? (y/n) n:

$ createdb -U django_user django_db

Password:

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

В этом примере создается новая учетная запись django_user базы данных, с правом создания баз данных, которая затем используется для создания новой базы данных django_db. Выполнив эти действия и указав имя пользователя и базы данных в файле settings.py (вместе с паролем, присвоенным пользователю), мы сможем использовать утилиту manage.py для создания и обновления таблиц в базе данных.   .3 MySQL

Еще одним господствующим сервером баз данных, распространяемым с открытыми исходными текстами, является MySQL. В отличие от некоторых других серверов баз данных, MySQL включает в себя два внутренних механизма баз данных, отличающихся набором возможностей: первый механизм — это MyISAM, в котором отсутствует поддержка транзакций и внешних ключей, но имеется поддержка полнотекстового поиска. Другой механизм -InnoDB, более новый и обладающий более широкими возможностями, но в настоящее время он не поддерживает полнотекстовый поиск. Существуют и другие механизмы, но эти два используются наиболее часто.

Для организации взаимодействий с MySQL в платформе Django отдается предпочтение библиотеке python-mysql.

Создание баз данных в MySQL обычно выполняется с помощью многоцелевого инструмента администрирования mysqladmin. Как и в случае с Postgres, прежде чем мы сможем создать новую учетную запись для проекта на платформе Django, нам необходимо выяснить имя суперпользователя базы данных и пароль. Обычно суперпользователь называется root и чаще всего изначально не имеет пароля (что следует исправить, как только появится такая возможность). Таким образом, создание базы данных выглядит примерно так, как показано ниже.

$ mysqladmin -u root create django_db

В отличие от Postgres, управление пользователями в MySQL выполняется исключительно на уровне базы данных, поэтому, чтобы создать пользователя django_user базы данных, нам необходимо сразу же воспользоваться командной оболочкой SQL, которая называется mysql и выполнить следующий пример.

$ mysql -u roottable information for completion of table and column namescan turn off this feature to get a quicker startup with -Ato the MySQL monitor. Commands end with ; or g.MySQL connection id is 6version: 5.0.51a-6 (Debian)’help;’ or ‘h’ for help. Type ‘c’ to clear the buffer.> GRANT ALL PRIVILEGES ON django_db.* TO

Теперь можно изменить настройки в файле settings.py и приступить к использованию команд manage.py. 4.4 Oracle

Последняя база данных, которая в настоящее время поддерживается платформой Django — это коммерческое предложение компании Oracle.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

Библиотека для организации взаимодействий с базой данных Oracle из программного кода на языке Python называется cx_oracle.

Двумя базами данных, которые в настоящее время не поддерживаются напрямую платформой Django, являются Microsoft SQL Server и IBM DB2.

Для нашего приложения на платформе Django мы будем использовать базу данных MySQL. После создания пользователя для базы данных, подключим её к Django. В файле settings.py редактируем параметр DATABASES.

Следующим шагом используем утилиту manage.py запускаем команду migrate. Она автоматически создает все нужные таблицы для работы Django в базе данных.

В Django большинство взаимодействий с базой данных осуществляется посредством механизма объектно-ориентированного отображения (Object-Relational Mapper или ORM) — функциональности, имеющейся, помимо Django, и в других современных инфраструктурах веб-разработки, таких как Rails. Системы ORM обретают все большую популярность среди разработчиков, так как они автоматизируют множество типичных взаимодействий с базой данных и используют знакомый объектно-ориентированный подход вместо инструкций SQL [6] [7].

Проект на платформе Django состоит из приложений. Опишем создание приложения вывода новостей и запись их в нашу базу данных.

После создания проекта intellectika нам нужно добавить в него приложение вывода новостей. Создаем приложение с использованием утилиты manager.py и команды startproject news, где news это название приложения.

После создания, каталог нашего проекта выглядит так:

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

Intellectika

__int__.py.py.py.py

__init__.py.py.py.py.py.py

manage.py

Файл для взаимодействия с базой данных — models.py. Urls.py — это отдельный файл URL в котором прописывается URL для отображения приложения новостей. Файл admin.py — нужен исключительно для удобства настройки отображения моделей в административной панели. views.py — файл управления логикой приложения. Файл tests.py — в нем описываются тесты для нашего приложения.

В файле models.py создаём модель News с нужными полями для отображения наших новостей.

# -*- coding: utf-8 -*-django.db import modelsdjango.utils import timezoneckeditor_uploader.fields import RichTextUploadingFieldNews(models.Model):_title = models.CharField(max_length=200,

vebose_name=’Заголовок:’)_text = RichTextUploadingField(verbose_name=’Текстовое поле:’)_file = models.FileField(blank=True, null=True, upload_to=

‘files/news/%Y/%m’, verbose_name=’Файл’)_date = models.DateField(verbose_name=’Дата:’)_date_time_published = models.DateTimeField(default=timezone.now,

verbose_name=’Дата и время публикации:’)

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

class Meta():_table = ‘news’_name_plural = ‘Новости’__unicode__(self):self.news_title

CharField — это текстовое поле для хранения коротких или длинных строк. RichTextUploadingField — редактируемое текстовое поле. Поле FileField используется для загрузки файлов. DateField и DateTimeField — поля отображение времени и даты. Так же в классе Meta мы указываем название таблицы в базе данных.

Некоторые приложения используют минимум одну таблицу в базе данных, поэтому нам необходимо их создать перед тем, как мы будем их использовать. Для этого с использованием утилиты manager.py и команды migrate, Django автоматически создаёт таблицу news в нашей базе данных и добавляет к ней уникальное поле id.

Для вывода новостей из базы данных нам нужно создать функцию представления в файле views.py.

# -*- coding: utf-8 -*-django.shortcuts import render, render_to_responsenews.models import Newsdjango.core.paginator import Paginatornews_all(request,page_number=1):_all = News.objects.order_by(‘-news_date_time_published’)_page = Paginator(news_all, 5)render_to_response(‘news_all.html’, {‘news_all’:

news_page.page(page_number)})

Где ключу news_all будет присвоено значение «News.objects.order_by(‘-news_date_time_published’)», означающее, что нужно вывести все объекты из класса News, отсортированные по полю news_date_time_published.Так же Django поддерживает одновременную работу с несколькими базами данных.

научный сайт база данный приложение

5. Разработка приложения для сайта

Проект сайта на фреймворке Django состоит из приложений, которые соответствуют вкладкам главного меню сайта. Рассмотрим алгоритм создания приложения вывода проектов научно-образовательного центра «Интеллектика».

Каталог нашего проекта выглядит следующим образом:

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

Intellectika

__int__.py.py.py.py.py

Для создания приложения используем утилиту manage.py с командой startapp project, где project — это имя нашего приложения. В каталоге нашего проекта создается папка с названием нашего приложения.

Intellectika

__int__.py.py.py.py

__init__.py.py.py.py.py.py.py

Теперь редактируем файл settings.py. В параметр INSTALLED_APPS добавляем имя нашего приложения project.

INSTALLED_APPS = (

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

‘django.contrib.admin’,

‘django.contrib.auth’,

‘django.contrib.contenttypes’,

‘django.contrib.sessions’,

‘django.contrib.messages’,

‘django.contrib.staticfiles’,

‘ckeditor’,

‘ckeditor_uploader’,

‘project’,)

В созданном нами приложении имеется файл models.py, в котором мы будем описывать поля модели нашего приложения. Создаем модель вывода проектов, этапов разработки и описываем все поля. Модели будут иметь связь «один ко многим», то есть у одного проекта может быть много этапов разработки.

# -*- coding: utf-8 -*-django.db import modelsckeditor_uploader.fields import RichTextUploadingFieldProjects(models.Model):_title = models.CharField(max_length=200,

verbose_name=’Заголовок: ‘)_text = RichTextUploadingField(verbose_name=’Текстовое поле: ‘)_date = models.DateField(verbose_name=’Дата: ‘)Meta():_table = ‘Projects’_name_plural = ‘Проекты центра’__unicode__(self):self.projects_titleStage(models.Model):_title = models.CharField(max_length=200, verbose_name=’Заголовок

этапа: ‘)_files = models.FileField(blank=True, null=True, upload_to=

‘files/project/%Y/%m’, verbose_name=’Файл: ‘)_date = models.DateField(verbose_name=’Дата: ‘)_projects = models.ForeignKey(Projects)Meta():_table = ‘Stage’_name_plural = ‘Этапы проекта’__unicode__(self):self.stage_title

После создания моделей, добавляем их в нашу базу данных с помощью команды migrate.

Когда модели были созданы и добавлены в базу данных, переходим к редактированию файлов urls.py, которые отвечают за конфигурацию URL нашего проекта и приложений. Первым редактируем файл urls.py нашего проекта. В нем добавляются URL ссылки для наших приложений.

# -*- coding: utf-8 -*-

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

from django.conf.urls import include, urldjango.contrib import admindjango.conf.urls.static import staticintellectica import settings= [(r’^admin/’, include(admin.site.urls)),(r’^ckeditor/’, include(‘ckeditor_uploader.urls’)),(r’^projects/’, include(‘project.urls’)),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Мы указываем, что после имени нашего домена, если встречено projects, будет перенаправление в файл urls.py нашего приложения.

Далее нам нужно отредактировать файл urls.py нашего приложения. Файл urls.py нашего приложения очень похож на urls.py нашего проекта, но тут уже идет не перенаправление, а вызов функций нашего приложения, как показано ниже в примере.

from django.conf.urls import url, includeproject import views= [(r’^(d+)/$’, views.projects),(r’^num/(?Pd+)/$’, views.project),]

Теперь нам нужно определить функции вывода нашего приложения. Вывод проектов должен быть таков, что на странице выводятся заголовки всех проектов и при нажатии на заголовок проекта идет перенаправление на полное описание этого проекта. Для этого реализуем две функции. Первая выводит заголовки всех проектов, а вторая выводит описание проекта. Так же для вывода заголовков проекта, нужно осуществить механизм постраничного вывода информации (пагинации).

В функции projects и project реализуем вывод всех объектов из базы данных, созданных моделями projects и stage (выборка проектов и этапов разработки) в шаблоны project.html и progects.html. В функциях мы так же определяем id, что бы этапы разработки проекта соответствовали самому проекту.

# -*- coding: utf-8 -*-django.shortcuts import render, render_to_responsedjango.core.paginator import Paginatorproject.models import Projects, Stageprojects(request, page_number=1):_all = Projects.objects.order_by(‘-projects_date’)_page = Paginator(projects_all, 5)render_to_response(‘projects.html’, {‘projects_all’:

news_page.page(page_number) })project(request, project_id=1):= {}[‘project’] = Projects.objects.get(id=project_id)[‘stage’] = Stage.objects.filter(stage_projects_id=project_id)render_to_response(‘project.html’, args)

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

В каталоге templates нашего приложения, мы создаем файлы project.html и progects.html, которые будут являться шаблонами вывода нашего приложения.

В файле projects.html мы добавляем значение ключей из функции projects, как показано ниже в примере.

{% load staticfiles %}

{% block content %}

{% for project in projects_all %}

{{ project.projects_title }}

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

{{ project.projects_title }}

{% endfor %}

{% if projects_all.has_previous %}

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

}}»>Назад

{% else %}

Назад

{% endif %}

Страница {{ projects_all.number }} из {{ projects_all.paginator.num_pages

}}

{% if projects_all.has_next %}

}}»>Вперед

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

{% else %}

Вперед

{% endif %}

{% endblock %}

В нем мы описываем вывод всех заголовков проектов, где заголовки будут ссылками на проект по их id. В нем так же необходимо реализовать кнопки пагинатора, добавленного в функцию projects.

В файле projects.html мы добавляем значение ключей из функции projects.

{% load staticfiles %}

{% block content %}

{{ project.projects_title }}

{{ project.projects_text|safe }}

Дата публикации: {{ project.projects_date}}

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

{{ s.stage_title }}

{% if s.stage_files %}

Скачать файл

{% endif %}

Дата публикации: {{ s.stage_date }}

{% endfor %}

{{ project.projects_title }}

{{ project.projects_text|safe }}

Дата публикации: {{ project.projects_date}}

{% for s in stage %}

{{ s.stage_title }}

{% if s.stage_files %}

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

Скачать файл

{% endif %}

Дата публикации: {{ s.stage_date }}

{% endfor %}

{% endblock %}

В projects.html мы осуществляем вывод проекта со всеми добавленными и относящимися к этому проекту этапами.

Таким образом, по определенным URL будет вызвана нужная нам функция, которая передаст в шаблон необходимые данные.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

6. Разработка приложения авторизации для просмотра закрытых научных проектов центра

Создадим приложение авторизации пользователей, которые смогут просматривать закрытые проекты научно-образовательного центра «Интеллектика». Запускаем команду startapp loginsys, где loginsys — это имя нашего приложения для авторизации.

Теперь структура нашего проекта выглядит следующим образом:

Intellectika

__int__.py.py.py.py

__init__.py.py.py.py.py.py

templates

manage.py

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

Редактируем файл settings.py. В параметр INSTALLED_APPS, после приложения для вывода проектов добавляем имя нашего приложения для авторизации пользователей loginsys.

INSTALLED_APPS = (

‘django.contrib.admin’,

‘django.contrib.auth’,

‘django.contrib.contenttypes’,

‘django.contrib.sessions’,

‘django.contrib.messages’,

‘django.contrib.staticfiles’,

‘ckeditor’,

‘ckeditor_uploader’,

‘project’,

‘loginsys’,

)

В данном случае, нам не нужно описывать модели для базы данных, поэтому начинаем с файла urls.py нашего проекта. Нам нужно добавить URL перенаправление в файл urls.py нашего приложения loginsys.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

# -*- coding: utf-8 -*-django.conf.urls import include, urldjango.contrib import admindjango.conf.urls.static import staticintellectica import settings= [(r’^admin/’, include(admin.site.urls)),(r’^ckeditor/’, include(‘ckeditor_uploader.urls’)),(r’^projects/’, include(‘project.urls’)),(r’^auth/’, include(‘loginsys.urls’)),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Теперь мы редактируем файл urls.py нашего приложения, добавляя в него URL. Каждый URL соответствует определенной функции представления из файла views.py.

# -*- coding: utf-8 -*-django.conf.urls import url, includeloginsys import views= [(r’^login/’, views.login),(r’^logout/’, views.logout),]

В файле views.py создаем функции представления авторизации. Функция login будет выполнять авторизацию пользователя на сайте, если он есть в базе данных нашего проекта, а функция logout будет производить деавторизацию пользователя на сайте.содержит встроенное приложение идентификации пользователей, предоставляя работу с пользователями, группами пользователей, правами и сессиями пользователей через встроенное приложение auth.

Так же функция login, осуществляет проверку, если она не находит пользователя в базе данных, появляется сообщение об ошибке.

# -*- coding: utf-8 -*-django.shortcuts import render_to_response, redirectdjango.contrib import authdjango.core.context_processors import csrflogin(request):= {}.update(csrf(request))request.POST:= request.POST.get(‘username’, »)= request.POST.get(‘password’, »)= auth.authenticate(username=username, password=password)user is not None:.login(request, user)redirect(‘/projects/1/’):

args[‘login_error’] = ‘Пользователь не найден’

return render_to_response(‘login.html’, args):render_to_response(‘login.html’, args)logout(request):.logout(request)redirect(‘/projects/1/’)

Следующим шагом мы создаем html шаблон нашего приложения в каталоге templates с именем login.html. В нем мы описываем форму авторизации пользователей, которая будет отправлять данных методом post по URL авторизации, вследствие чего будет выполняться функция login.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

{% load staticfiles %}

{% block content %}

Авторизируйстесь в системе для просмотра всех проектов

центра

{% csrf_token %}

Имя пользователя:

Пароль:

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

{% if login_error %}

{{ login_error }}

{% endif %}

{% endblock %}

Для отображения закрытых проектов центра, нам требуется отредактировать наше приложение projects. Создаём в файле models.py дополнительное поле BooleanField для модели Projects, у которого будет два значения (True и False). Если значение равно True, то запись будет отображаться для всех, а если False, то только для авторизированных пользователей.

class Projects(models.Model):_title = models.CharField(max_length=200,

verbose_name=’Заголовок: ‘)_text = RichTextUploadingField(verbose_name=’Текстовое поле: ‘)_date = models.DateField(verbose_name=’Дата: ‘)_check = models.BooleanField(default=True, blank=True,

verbose_name=’Показывать всем пользователям: ‘)

class Meta():_table = ‘Projects’_name_plural = ‘Проекты центра’__unicode__(self):self.projects_title

Осталось отредактировать html шаблон project.html приложения project. В начало шаблона добавляем ссылки входа и выхода. Они будет отображаться условием, если пользователь не авторизирован — ссылка «Вход», если пользователь авторизирован — ссылка «Выход».

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

Необходимо добавить условия вывода проектов. Если пользователь авторизирован — ему отображаются все проекты центра, если пользователь не авторизирован — ему отображаются проекты, у которых поле BooleanField равно True.

{% load staticfiles %}

{% block content %}

{% if username %}

}})

{% else %}

{% endif %}

Проекты научно-образовательного центра «Интеллектика»

{% for project in projects_all %}

{% if username %}

{{ project.projects_title }}

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

{% elif project.projects_check %}

{{ project.projects_title }}

{% endif %}

{% endfor %}

{% if projects_all.has_previous %}

}}»>Назад

{% else %}

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

Назад

{% endif %}

Страница {{ projects_all.number }} из {{ pro-

jects_all.paginator.num_pages }}

{% if projects_all.has_next %}

}}»>Вперед

{% else %}

Вперед

{% endif %}

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

{% endblock %}

Таким образом, мы реализовали авторизацию на сайте для просмотра закрытых проектов научно-образовательного центра «Интеллектика».

Регистрацию пользователей осуществляет администратор сайта. При регистрации пользователей, администратор самостоятельно через интерфейс задает права пользователям, полные права для управления сайта или же создание пользователя для просмотра всех проектов центра.

7. Тестирование сайта

Тестирование сайта — это проверка сайта различными способами на правильную работу.

Тестирование сайта обычно используют перед запуском проекта, чтобы получить гарантии правильной работоспособности или уже на существующем проекте, чтобы повысить его эффективность. Чем сложнее сайт, тем в более серьезном тестировании он нуждается.

.1 Конфигурационное тестирование

Этот вид тестирования позволяет проверить, как сайт ведет себя при различных разрешениях экрана, в различных веб-браузерах. Для проверки были выбраны 5 самых популярных веб-браузеров:

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

1)    Google Chrome — версии 51.0.2704.84 m;

2)      Opera — версии 38.0.2220.29;

)        Yandex Brouser — версии 16.6.0.8149;

)        Mozila Firefox — версии 46.0.1;

)        Internet Explorer — версии 11.

Как показали тесты, при различных разрешениях экрана, в различных браузерах внешний вид и функциональность сайта не изменились. Внешний вид сайта изображен на рисунке 7.1.

.2 Верность HTML кода

Проверка верности HTML кода страниц сайта. Для такого рода тестирования написано множество утилит — от простых скриптов до мощных валидаторов, проверяющих весь сайт на соответствие стандартам. Сайт научно образовательного центра «Интеллектика» был проверен одним из самых популярных валидаторов W3C. Результаты успешной проверки показаны на рисунке 7.2.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

Рисунок 7.1 — Внешний вид сайта

Рисунок 7.2 — Результат успешной проверки сайта

7.3 Функциональное тестирование

Этот вид тестирования проверяет соответствие реализованных функций.

Было проведено тестирование всех страниц сайта на правильность вывод информации. Особое внимание было уделено страницам, использующих функцию отображения при авторизации, такими являются страницы вывода всех проектов научно центра.

Для не авторизованного пользователя, страница изображена на рисунке 7.3.

Рисунок 7.3 — Вид страницы проектов для не авторизированных пользователей

На странице отображаются только те проекты, у которых администратор сайта при добавлении поставил значение «Показывать всем пользователям». Показано на рисунке 7.4.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

Для авторизированных пользователей, страница с проектами выглядит следующим образом. Как оказано на рисунке 7.5. На ней отображаются все проекты научно-образовательного центра.

Рисунок 7.4 — Значение для пользователей

Рисунок 7.5 — Вид страницы проектов для авторизированных пользователей

.4 Тестирование безопасности

Это одно из самых важных видов тестирования. Внимание было уделено формам авторизации пользователей и форме администратора на сайте. Для авторизации пользователей была создана форма авторизации. Если пользователь попытается ввести данные, которых нет в базе данных, страница выведет ошибку, как показано на рисунке 7.6.

Рисунок 7.6 — Ошибка формы авторизации пользователей

Так же при авторизации администраторов сайта, если пользователя нет в базе данных, форма вызовет ошибку.

Регистрацией пользователей занимается администратор сайта. При регистрации он назначает права пользователю, такие как:

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

)      суперпользователь — пользователь имеет все права на редактирование и просмотр всего сайта.

2)      активный пользователь — пользователь имеет права на просмотр всего сайта.

В итоге, после проведения тестирования сайт удовлетворяет нашим техническим требованиям.

8. Разработка документации для администратора сайта

Сайт создан на основе общей системы управления содержимым (далее система управления), которая представляет собой набор инструментов, позволяющих администраторам без знания языков программирования и, не обращаясь к разработчикам изменять содержимое. Доступ к управлению сайтом предоставляется через интернет, с помощью стандартного web-браузера.

Чтобы получить полный доступ к системе управления содержимым сайта необходимо авторизоваться (войти на сайт под учетной записью) с правами администратора. Для этого требуется открыть сайт по ссылке (<#»897347.files/image009.jpg»>

Рисунок 8.1 — Система управления содержимым

Система управления содержимым сайта позволяет изменять и добавлять информацию. Для добавления информации на сайт требуется выбрать соответствующую главному меню вкладку, нажать кнопку «добавить» и заполнить, необходимы поля.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

Рисунок 8.2 — Поля для заполнения

Заголовок будет отображаться на странице всех проектов центра ссылкой ведущей на полное описание проекта. Текстовое поле имеет редактор для удобного отображения текста об информации проекта. Так же необходимо заполнить поле даты и галкой выбрать условие, будет проект отображаться всем пользователям или только авторизированным.

Каждому проекту можно добавить несколько этапов разработки, для этого требуется заполнить нужные поля. Заголовок и дата заполняются описанием и датой публикации этапа. Что бы загрузить файл, достаточно нажать на кнопку выбора файла и загрузить его из операционной системы. Если требуется загрузить несколько файлов их нужно добавить в один архив и загрузить. Как было описано выше, одному проекту можно добавлять несколько этапов разработки. Для этого нужно нажать на кнопку «Добавить еще один Stage».

Когда все поля были заполнены корректно, остается нажать на кнопку сохранения и система управления откроет страницу со всеми существующими проектами центра.

Для добавления новостей центра, нажимаем на кнопку «добавить», напротив вкладки «Новости», вследствие чего открывается страница добавления новостей. Показано на рисунке 8.3.

Рисунок 8.3 — Страница добавления новостей

Заголовок будет отображаться на странице всех новостей центра ссылкой ведущей на полное описание новости. Текстовое поле так же имеет редактор для удобного отображения текста об информации проекта. Для новости остаётся указать дату и при необходимости прикрепить файл.

Если все необходимые поля заполнены, нажимаем кнопку «сохранить» и система управления откроет страницу со всеми существующими новостями центра.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Заказать диплом

Для добавления элемента в структуру центра, нажимаем на кнопку «добавить», напротив вкладки «Структура центра», вследствие чего открывается страница добавления элемента. Показано на рисунке 8.4.

Рисунок 8.4 — Страница добавления элемента

Заголовок будет отображаться на странице элементов структуры центра ссылкой ведущей на полное описание элемента или на внешний сайт. Текстовое поле имеет редактор для удобного отображения текста. Для того, что бы заголовок элемента структуры центра ввел на внешний сайт, необходимо заполнить поле ссылки, указав адрес перенаправления. Если не будет указана, то необходимо заполнить текстовое поле для описания элемента структуры.

Далее жмём кнопку сохранения, и система управления откроет страницу со всеми элементами структуры центра.

Для изменения информации на сайт требуется выбрать соответствующую главного меню вкладку и нажать кнопку «изменить». Система управления откроет страницу со всеми элементами, соответствующими главному меню для изменений. Необходимо выбрать нужный для изменения элемент и щелкнуть по нему мышкой. Откроется необходимая для нас информация, редактируем и сохраняем.

При необходимости загрузки фотографий или изображений, их можно загружать через редактируемые текстовые поля. Для этого необходимо, при добавлении или изменении информации нажать на соответствующую кнопку редактируемого поля. Показано на рисунке 8.5.

Рисунок 8.5 — Редактируемое текстовое поле

Система управления откроет форму загрузки, где необходимо выбрать вкладку «Загрузить», выбрать файл из операционной системы и загрузить его на веб-сервер. При необходимости, после загрузки необходимо изменить размер картинки или изображения. Для этого необходимо во вкладе «Данные об изображении» указать ширину, высота изображения изменится автоматически, как показано на рисунке 8.6.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

Рисунок 8.6 — Вкладка «Данные об изображении»

После добавления картинки или фотографии, она отобразиться в редактируемом поле. При необходимости добавляем текст или описание.

За регистрацию пользователей отвечает администратор сайта, только у него есть права на добавление и удаление пользователей. Для добавления пользователей необходимо перейти на главную страниц системы управления и нажать на кнопку «пользователи». Система управления откроет страницу со всем пользователями. Показано на рисунке 8.7.

Рисунок 8.7 — Страница пользователей

Для добавления необходимо нажать на кнопку «добавить пользователя». Необходимо ввести логин, пароль пользователя и нажать кнопку сохранения. Далее требуется указать дополнительную информацию о пользователе и выбрать необходимые права доступа.

Активный пользователь имеет права авторизации на сайте для просмотра закрытых научных проектов центра.

Пользователь со статусом персонала имеет права на добавление и редактировании информации на сайте.

Статус персонала присваивается тем пользователям, которые будут иметь полные права на управление сайтом.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Подробнее

ЗАКЛЮЧЕНИЕ

Результатом выпускной квалификационной работы является создание сайта для научно-образовательного центра «Интеллектика», главной целью которого является внедрение инновационных образовательных программ и поведения фундаментальных и прикладных исследований в области информатики и искусственного интеллекта.

В процессе написания выпускной квалификационной работы были учтены современные интернет-технологии, программные инструменты, основные понятия, способы представления различной информации на страницах сайта, а так же правила и советы по разработке и созданию сайтов.

При разработке сайта был проведен анализ существующих систем для разработки сайта, вследствие чего был выбран фреймворк Django, написанный на языке программирования Python.

Базой данных была выбрана MySQL. Она является наиболее приспособленной для применения в интернет-технологиях СУБД (системой управления базами данных). Для исполнения приложений клиента на большинстве хостинг-провайдеров предоставляется небольшое количество ресурсов (как вычислительных, так и дисковых). Поэтому для данного применения необходима высокоэффективная СУБД, обладающая при этом высокой надежностью (большинство web-приложений и сайтов должны работать в режиме 24/7). По всем этим причинам MySQL стала незыблемым стандартом в области СУБД для интернет-технологий.

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

Так же перед размещением сайта в сети интернет было проведено его тестирование, чтобы получить гарантии правильной работоспособности сайта.

Для правильной работы сайта научно-образовательного центра была разработана документация администратора сайта.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

Сайт удовлетворяет всем поставленным задачам и техническим требованиям. Он отражает всю структуру научно-образовательного центра «Интеллектика», специфику деятельности и отображение информации для пользователей.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Хахаева, И.А. Практикум по алгоритмизации и программированию на Python: учебно-методический комплекс / И.А. Хахаева. — Москва: Альт Линукс, 2011. — 226 с.

. Чан, У. Python. Создание приложений / Уэсли Чан. — Санкт-Петербург: Вильямс, 2015. — 816 c.

. Лутц, М. Изучаем Python, 4-е издание / Марк Лутц. — Санкт-Петербург: Символ-Плюс, 2011. — 1280 с.

. Лутц, М. Программирование на Python, в 2 т. Т. 1, 4-е издание / Марк Лутц. — Санкт-Петербург: Символ-Плюс, 2011. — 992 с.

. Лутц, М. Программирование на Python, в 2 т. Т. 2, 4-е издание / Марк Лутц. — Санкт-Петербург: Символ-Плюс, 2011. — 992 с.

. Форсье, Д. Django. Разработка веб-приложений на Python / Джефф Форсье, Пол Биссекс, Уэсли Чан. — Санкт-Петербург: Символ-Плюс, 2010. — 458 c.

Нужна помощь в написании диплома?

Мы — биржа профессиональных авторов (преподавателей и доцентов вузов). Сдача работы по главам. Уникальность более 70%. Правки вносим бесплатно.

Цена диплома

. Головатый, А. Django. Подробное руководство / Адриан Головатый, Джейкоб Каплан-Мосс. — Санкт-Петербург: Символ-Плюс, 2010. — 560 c.

. Документация PHP [Электронный ресурс]: офиц. сайт

. Документация Ruby [Электронный ресурс]: офиц. сайт

. Документация Python[Электронный ресурс]: офиц. сайт

. Документация Django [Электронный ресурс]: офиц. сайт

. Документация Joomla [Электронный ресурс]: офиц. сайт

. Документация Ruby on Rails [Электронный ресурс]: офиц. сайт

Download 1.04 Mb.

bet 1/16
Sana 23.06.2022
Hajmi 1.04 Mb.
#773796
Turi Курсовая

Bog’liq
kursovaya yudichev dmitriy 37gruppa2018
жадвал иловалар буйича, Algoritmlarni loyihalash, Valealogiya, amaliy uchun topshiriq (2), amaliy uchun topshiriq (2), amaliy uchun topshiriq (2), pdf 20221220 162615 0000, Y8badavLR3JykL7zM04qMgL06zgeBT5jZ8bP4VtT, Tursunmurodov .A, Xurramov X, 7-МАЪРУЗА. Бетон қоришмаси ва бетон хоссалари, бетон турлари

    Bu sahifa navigatsiya:

  • РАЗРАБОТКА ПРИЛОЖЕНИЙ НА PYTHON DJANGO

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение

высшего образования

«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

(ФГБОУ ВО «КубГУ»)

Кафедра прикладной математики

КУРСОВАЯ РАБОТА

РАЗРАБОТКА

ПРИЛОЖЕНИЙ НА PYTHON DJANGO

Работу выполнил ______________________________________ Д. В. Юдичев

(подпись, дата) (инициалы, фамилия)

Факультет компьютерных технологий и прикладной математики курс 3

Направление 09.03.03 Прикладная информатика

Научный руководитель,

к анд. экон. наук,

доцент ___________________________________________ А. В. Коваленко (подпись, дата) (инициалы, фамилия)

Нормоконтролер,

к. ф.-м. н.____________ _ ______________________________ Г. В. Калайдина

(подпись, дата) (инициалы, фамилия)

Краснодар 2018

СОДЕРЖАНИЕ

1 История и архитектура Python и его фреймворка Django 3

1.1 История создания языков программирования 3

1.2 Современные языки программирования 5

1.3 Характеристики Python 5

1.4 История создания Python 7

1.4.1 Первая версия 7

1.4.2 Версия 1.0 и 1.2 8

1.4.3 Проект «Программирование для всех» и Python 8

1.4.4 Версии 1.6, 1.6.1 и 2.0 9

1.4.5 Версии 2.х и 3.х 10

1.5 История создания Django 10

1.6 Особенности Django 12

1.7 Структура Django-приложения 12

1.8 Особенности Python 13

1.8.1 Исключения 17

1.8.2 Переменные 20

1.8.3 Группировка операторов 21

1.8.4 Цикл for 23

1.8.5 Списки 24

1.8.6 Кортежи 29

1.8.7 Словари 32

1.9 База данных PostgreSQL 33

2 Разработка клиент-серверного приложения 34

2.1 Подготовка к работе 34

2.2 Приступаем к работе 39

2.3 Настройка urls.py 42

2.4 Создание моделей 44

2.5 Создание представлений и шаблонов 45

51

53

2.6 Тестирование 57

ЗАКЛЮЧЕНИЕ 68

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 69

Do’stlaringiz bilan baham:


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *