Понедельник, 11 Ноября 2024, 01:02

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [357]
Статьи об общих понятиях связанных с созданием игр.
Программирование [83]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [147]
Статьи о программах для создания игр, уроки и описания.
Софт [43]
Различные программы, в том числе в помощь игроделам.
2D-графика [14]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [17]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [5]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [167]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [131]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Игры какого жанра вы предпочитаете делать?
Всего ответов: 14618
Главная » Статьи » Программирование

Создаем свой сайт/игру на Python. Часть 3
Вступление
В первых двух частях мы разобрали основы Web.Python. Но этого мало, чтобы создать хороший сайт. Поэтому следует запомнить ещё несколько параграфов.

Сессии
Сессии - важный момент при создании системы управления сайтом. Фактически, это каркас системы пользователей, авторизации и регистрации. Простой пример использования сессий:
Код
web.config.debug = False
urls = (
  "/count", "count",
  "/reset", "reset"
)
app = web.application(urls, locals())
session = web.session.Session(app, web.session.DiskStore('sessions'), initializer={'count': 0})

class count:
  def GET(self):
  session.count += 1
  return str(session.count)

class reset:
  def GET(self):
  session.kill()
  return ""

if __name__ == "__main__":
  app.run()

Тут мы проводим операцию прибавления при помощи сессий.
Объект с сессиями обрабатывается до загрузки скрипта. При помощи баз данных можно сохранять данные про сессии:
Код
create table sessions (
  session_id char(128) UNIQUE NOT NULL,
  atime timestamp NOT NULL default current_timestamp,
  data text
);

Собственно, требуется подключить базу данных для произведения этого действия:
Код
db = web.database(dbn='postgres', db='mydatabase', user='myname', pw='')
store = web.session.DBStore(db, 'sessions')
session = web.session.Session(app, store, initializer={'count': 0})

В web.config можно изменять настройки сессий. В общих чертах разобрались, теперь давайте сделаем авторизацию.

Авторизация
Это не является полноценной системой и служит скорее для закрытия определённых частей сайта. В данном примере используется СУБД SQLite.

Код
import hashlib # Импортирует md5 библиотеку для шифровки
import web # Подключение Web к Python

def POST(self):
  i = web.input() # Получаем введённые данные

  authdb = sqlite3.connect('users.db') # Подключаем базу данных
  pwdhash = hashlib.md5(i.password).hexdigest() # Шифруем пароль
  check = authdb.execute('select * from users where username=? and password=?', (i.username, pwdhash)) # Ищем пользователя с таким логином и паролем
  if check: # Если есть такая пара...
  session.loggedin = True # Записываем в сессию, что пользователь авторизован
  session.username = i.username # Записываем в сессию имя пользователя
  raise web.seeother('/results') # Перебрасываем пользователя по адресу /results
  else: return render.base("Those login details don't work.") # Если пароль не совпадает, показываем ошибку


Простой блог
Итак, давайте забабахаем что-то эдакое. По скольку во второй части вам был обещан блог, придётся выкручиваться. Структура файлов такова:

- /blog.py
- /templates:
--- /templates/view.html
--- /templates/new.html
--- /templates/base.html
--- /templates/index.html
--- /templates/edit.html
- /model.py

blog.py - главный скрипт всей системы. По скольку основные функции мы уже разобрали, не составит труда понять содержимое этого файла:

Код
import web
import model

### Определение ссылок

urls = (
  '/', 'Index',
  '/view/(\d+)', 'View',
  '/new', 'New',
  '/delete/(\d+)', 'Delete',
  '/edit/(\d+)', 'Edit',
)

### Шаблоны
t_globals = {
  'datestr': web.datestr
}
render = web.template.render('templates', base='base', globals=t_globals)

class Index:

  def GET(self):
  """ Show page """
  posts = model.get_posts()
  return render.index(posts)

class View:

  def GET(self, id):
  """ View single post """
  post = model.get_post(int(id))
  return render.view(post)

class New:

  form = web.form.Form(
  web.form.Textbox('title', web.form.notnull,  
  size=30,
  description="Post title:"),
  web.form.Textarea('content', web.form.notnull,  
  rows=30, cols=80,
  description="Post content:"),
  web.form.Button('Post entry'),
  )

  def GET(self):
  form = self.form()
  return render.new(form)

  def POST(self):
  form = self.form()
  if not form.validates():
  return render.new(form)
  model.new_post(form.d.title, form.d.content)
  raise web.seeother('/')

class Delete:

  def POST(self, id):
  model.del_post(int(id))
  raise web.seeother('/')

class Edit:

  def GET(self, id):
  post = model.get_post(int(id))
  form = New.form()
  form.fill(post)
  return render.edit(post, form)

  def POST(self, id):
  form = New.form()
  post = model.get_post(int(id))
  if not form.validates():
  return render.edit(post, form)
  model.update_post(int(id), form.d.title, form.d.content)
  raise web.seeother('/')

app = web.application(urls, globals())

if __name__ == '__main__':
  app.run()


Кстати, для блога требуется таблица с подобной структурой:

Код
CREATE TABLE entries (
  id INT AUTO_INCREMENT,
  title TEXT,
  content TEXT,
  posted_on DATETIME,
  primary key (id)
);


Шаблон вывода записи (/templates/view.html):
Код
$def with (post)

<h1>$post.title</h1>
$datestr(post.posted_on)<br/>

$post.content

Как видите, используется шаблонизатор Python.

Шаблон добавления записей (/templates/new.html):
Код
$def with (form)

<h1>New Blog Post</h1>
<form action="" method="post">
$:form.render()
</form>


Шаблон шапки блога (/templates/base.html):
Код
$def with (page)

<html>
<head>
  <title>My Blog</title>
  <style>
  #menu {
  width: 200px;
  float: right;
  }
  </style>
</head>
<body>

<ul id="menu">
  <li><a href="/">Home</a></li>
  <li><a href="/new">New Post</a></li>
</ul>

$:page

</body>
</html>


Шаблон главной (/templates/index.html):
Код
$def with (posts)

<h1>Blog posts</h1>

<ul>
$for post in posts:
  <li>
  <a href="/view/$post.id">$post.title</a>  
  from $datestr(post.posted_on)  
  <a href="/edit/$post.id">Edit</a>
  </li>
</ul>


Шаблон редактора (/templates/edit.html):
Код
$def with (post, form)

<h1>Edit $form.d.title</h1>

<form action="" method="post">
$:form.render()
</form>

<h2>Delete post</h2>
<form action="/delete/$post.id" method="post">
  <input type="submit" value="Delete post"/>
</form>


Нам пригодится ещё один скрипт, который обрабатывает данные и добавляет их в базу данных (/model.py):
Код
import web, datetime

db = web.database(dbn='mysql', db='blog', user='justin')

def get_posts():
  return db.select('entries', order='id DESC')

def get_post(id):
  try:
  return db.select('entries', where='id=$id', vars=locals())[0]
  except IndexError:
  return None

def new_post(title, text):
  db.insert('entries', title=title, content=text, posted_on=datetime.datetime.utcnow())

def del_post(id):
  db.delete('entries', where="id=$id", vars=locals())

def update_post(id, title, text):
  db.update('entries', where="id=$id", vars=locals(),
  title=title, content=text)


Поздравляю! Вы создали свой блог. Если вы обладаете базовыми навыками Python и Web.Python, то можете спокойно связать авторизацию и блог.

Скорее всего, это будет последний урок серии. Дальше - только примеры.
Категория: Программирование | Добавил: JackNazaryan (09 Июня 2014)
Просмотров: 10337 | Рейтинг: 5.0/3 |
Теги: Pro 11.00.1112 DC 25022012, Python, свой сайт, web.python, Питон, Совя игра, web, Создаем свой сайт, программирование, ЯП
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «Создаем свой сайт/игру на Python. Часть 3», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • DreamSDK
  • G3D Engine
  • Murl
  • Doom Classic iOS
  • BlitzMax
  • 3D Мастер
  • SecondBASIC
  • Stencyl
  • RPG Tools
  • URQ
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг