Пишем движок блога на Python + Django
Допустим, вы хотите написать веб-приложение. Пусть это будет движок для блога.
На PHP надо написать, как приложение будет сохранять в базу данных переданные ему данные (в админке) и отображать их для пользователя. А так же закрыть уязвимости.
Представьте, если не нужно писать код для обращения с базой данных. И не надо самому изобретать функции обработки шаблонов. А так же уязвимости не возникают.
Это не мечта, это Django. Фреймворк для создания веб-приложений на простом, но мощном языке Python. Попробуем?
Для начала установим Python версии выше 2.3. Потом скачаем Django с официального сайта. Не ставьте из убунтовских репозиториев, а то придётся делать лишние движения типа изменений PATH и добавления прав запуска для скриптов. Скачали, распаковали, sudo python setup.py install
сделали. Готово! Можно приступать.
Создаём проект и приложение. (Проект может содержать несколько приложений, а приложение можно копировать в разные проекты. Понятно?) Мы делаем личный блог. Назовём проект vasyasite, а приложение blog.
django-admin.py startproject vasyasite
cd vasyasite
django-admin.py startapp blog
Отлично. Мы готовы, можно протестировать встроенный сервер...
Так, я сказал "встроенный сервер"? Да, Django предоставляет разработчикам сервер для тестирования, написанный на Python. (Где вы ещё видели такую заботу о разработчиках?)
python manage.py runserver
Теперь по адресу http://127.0.0.1:8000/ находится проект vasyasite. Там сейчас только страница с сообщением о том, что Django отлично работает. Ctrl+C его, да! Пока нам сервер не понадобится. Создадим в папке проекта папки templates и media.
Надо бы настроить проект, для этого редактируем settings.py. Мы будем использовать SQLite для баз данных - это просто. Прописываем 'sqlite3' в DATABASE_ENGINE и путь к файлу в DATABASE_NAME. У меня '/home/lol2fast4u/vasyasite/blog.db'. Если такого файла нет - он автоматически создаётся. Не забывайте сменить TIME_ZONE на свою (у меня Europe/Moscow) и LANGUAGE_CODE на 'ru-ru'. Сами догадаетесь, куда прописать созданные папки media и templates, конфиг интуитивно понятен. Тем, кто знает английский %) В INSTALLED_APPS надо дописать плагин комментариев(да. он здесь встроенный есть!), админпанель и своё приложение. У меня выглядит так:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.admin', 'django.contrib.comments', 'vasyasite.blog', )
from django.db import models class Category(models.Model): name = models.CharField(max_length=100) def __unicode__(self): return self.name class Post(models.Model): category = models.ForeignKey(Category) name = models.CharField(max_length=100) datetime = models.DateTimeField('Date published') content = models.TextField(max_length=100000) def __unicode__(self): return self.name
from vasyasite.blog.models import Category, Post from django.contrib import admin admin.site.register([Category, Post])
from django.shortcuts import render_to_response from vasyasite.blog.models import Category, Post def main(request): posts = Post.objects.order_by('-id') categories = Category.objects.order_by('-id') return render_to_response('index.html', {'posts': posts, 'categories': categories, 'iscomments': 'false'}) def category(request, category_id): posts = Post.objects.filter(category=category_id).order_by('-id') categories = Category.objects.order_by('-id') return render_to_response('index.html', {'posts': posts, 'categories': categories, 'iscomments': 'false'}) def post(request, post_id): posts = Post.objects.filter(id=post_id) categories = Category.objects.order_by('-id') return render_to_response('index.html', {'posts': posts, 'categories': categories, 'iscomments': 'true'})
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru"> <head> <title>Блог Василия Пупкина</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <style type="text/css"> body { margin: 0; padding: 0; } #header { background: #edd400; margin-bottom: 1em; } h1 { font: 2em sans-serif; } h2 { font: 1.2em sans-serif; } #sidebar { background: #c4a000; float: left; width: 10em; display: inline; margin-left: 1em; } #content { margin-left: 12em; margin-right: 1em; } .post { background: #c4a000; padding: 1em; margin: 1em 0em 1em 0em; } .meta { border: 0.2em dotted #edd400; margin: 0.1em; } #footer { background: #edd400; clear: both; } </style> </head> <body> <div id="header"> <h1><a href="/">Блог Василия Пупкина</a></h1> <h2>Работает на Django</h2> </div> <div id="sidebar"> Категории: <ul> {% for category in categories %} <li><a href="/category/{{ category.id }}">{{ category.name }}</a></li> {% endfor %} </ul> </div> <div id="content"> {% for post in posts %} <div class="post"> <div class="meta">{{ post.datetime }} <a href="/category/{{ post.category.id }}">{{ post.category.name }}</a> → <a href="/post/{{ post.id }}">{{ post.name }}</a></div> {{ post.content }} {% ifequal iscomments 'true' %} {% load comments %} {% get_comment_list for post as allcomments %} {% for acomment in allcomments %} <div class="meta"><a href="{{ acomment.user_url }}">{{ acomment.user_name }} </a>: {{ acomment.comment }}</div> {% endfor %} <div class="meta">{% render_comment_form for post %}</div> {% endifequal %} </div> {% endfor %} </div> <div id="footer"> <p>Разметка от <a href="http://myfreeweb.ru">MyFreeWeb.ru</a></p> </div> </body> </html>
urlpatterns = patterns('vasyasite.blog.views', (r'^$', 'main'), (r'^category/(?P<category_id>\d+)/$', 'category'), (r'^post/(?P<post_id>\d+)/$', 'post'), (r'^admin/(.*)', admin.site.root), (r'^comments/', include('django.contrib.comments.urls')), )
Домашнее задание: прикрутить RSS и комментарии IntenseDebate.
P.S. Читайте официальную документацию!
Постовой:
Здесь можно купить охотничье ружьё
Лучшие обои для мобильного
Фентези обои для мобильного телефона
Как скачать фильмы из интернета?
Мануальный массаж на дому в пределах МКАД.
Фентези обои для мобильного телефона
Как скачать фильмы из интернета?
Мануальный массаж на дому в пределах МКАД.
