Форум сайта python.su
Это не вопрос, а так, статья (моя первая, прошу больно не бить, и я не знаю куда писать - блога у меня нет, решил написать здесь - тут каждый день бываю)
Решился придумать велосипед и прикрутить к django капчу.
И так начнём.
Файл captcha.py:
# -*- coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageFont
#импортируем наши настройки
from django.conf import settings
from climat.settings import *
def captcha(request):
# случайный генератор
from random import choice
# sha для генератора хэша
import sha, os
# создаём 5 случайных знаков + секретный ключ
SALT = settings.SECRET_KEY[:20]
imgtext = ''.join([choice('qwertyupasdfghjkzxcvbnm123456789') for i in range(5)])
# наш хэш
imghash = sha.new(SALT+imgtext).hexdigest()
# открываем нашу картинку заднего фона средствами PIL
# settings.BACKGROUND_IMG_KAPTCHA в сетингах прописываем нашу картинку-бэграунд
im=Image.open(settings.BACKGROUND_IMG_KAPTCHA)
draw=ImageDraw.Draw(im)
#в сеттингах прописываем путь к нашему шрифту для капчи
font=ImageFont.truetype(settings.BACKGROUND_FONT_KAPTCHA, 57)
#пишем на нашей картинке текст
draw.text((10,5), imgtext, font=font, fill=(100,100,50))
# для имени картинки исрользую ІР юзера
temp =os.path.join(settings.PROJECT_DIR, "media/"+request.META['REMOTE_ADDR']+".jpg" )
tempname = request.META['REMOTE_ADDR']+'.jpg'
im.save(temp, format='JPEG')
#возвращаем хэш катринки и название картинки
arr = { 'imghash': imghash, 'tempname':tempname }
return arr
#ф-ция, где будет выводиться наша капча
def newses(request,offset):
#наш темлейт
template = 'newses.html'
news = News.objects.get(id=int(offset))
from climat.core.captcha import captcha
captcha = captcha(request)
if request.user.is_authenticated():
user = request.user
return render_to_response(template, { 'news':news, 'user':user, 'captcha':captcha })
#ф-ция, для аякса
def ajax_send_comments(request):
res = {'success':False}
if request.method == u'POST':
POST = request.POST
object_type = POST['object_type']
object_id = POST['object_id']
user_id = POST['user_id']
comment = POST['comment']
imghash = POST['imghash']
imgtext = POST['imgtext']
from django.contrib.comments.models import Comment
import datetime, sha
SALT = SECRET_KEY[:20]
if imghash == sha.new(SALT+imgtext).hexdigest():
c = Comment(
user_id = int(user_id),
comment = comment,
submit_date = datetime.date.today(),
ip_address = request.META.get("REMOTE_ADDR", None),
content_type_id = int(object_type),
object_pk = object_id,
site_id = 1
)
c.save()
res = { 'ip': request.META.get("REMOTE_ADDR", None), 'object_type':object_type, 'object_id':object_id, 'user_id':user_id, 'comment':comment, 'imgtext':imghash, 'sha':sha.new(SALT+imgtext).hexdigest() }
res = simplejson.dumps(res)
return http.HttpResponse(res, mimetype='application/json')
{% extends "base.html" %}
{% block title %} Activation {% endblock %}
<script type="text/javascript" src="/media/js/jquery-1.3.2.min.js"></script>
{% block extra_scripts %}
<script type="text/javascript" src="/media/js/newses.js"></script>
<link href="/media/css/news.css" rel="stylesheet" type="text/css" media="screen" />
{% endblock %}
{% block content %}
{% load multilingual_tags %}
{{ news.title }}
{% load comments %}
{% get_comment_list for news as allcomments %}
{% for acomment in allcomments %}
<b> <div class="meta"><a href="{{ acomment.user_url }}">{{ acomment.user_name }}</a>: {{ acomment.comment }}</div></b>
<input type="button" onclick="" value="com_com" />
<br/>
<div class="form_comment" id="form_comment">
<input name="object_type" value="10" id="object_type" type="hidden">
<input name="object_id" value="{{news.id}}" id="object_id" type="hidden">
<input name="user_id" value="{{user.id}}" id="user_id" type="hidden">
<input type="hidden" value="{{ captcha.imghash }}" name="imghash" id="imghash" >
<p>
<label for="comment">Comment</label>
<textarea id="comment" rows="10" cols="40" name="comment"></textarea>
</p>
<p>
<input type="text" size="20" name="imgtext" id="imgtext"><br />
<img src="/media/{{ captcha.tempname }}"><br />
</p>
<p class="submit">
<input name="post" class="submit-post" value="Post" type="button" onclick="send_comments()">
</p>
</div>
<input type="button" onclick="view_comments_panel()" value="com_news" />
{% endfor %}
{% endblock %}
function view_comments_panel( ){
$('#form_comment').show();
}
function send_comments(){
if($('#comment').val().length > 2){
$.post("/ajax/send_comments/",
{
object_type : $('#object_type').val(),
object_id : $('#object_id').val(),
user_id : $('#user_id').val(),
comment : $('#comment').val(),
imghash : $('#imghash').val(),
imgtext : $('#imgtext').val()
},
function(data){
alert(data.imgtext+' r '+ data.sha);
},'json'
);
}
}
Офлайн
Оптимизировать по какому критерию?
Офлайн
Ferroman
Да по всем критериям (быстрота исполнения, безопасность и т.д. и т.п.)
Офлайн