Другое¶
Отправка email сообщений¶
from django.core.mail import send_mail
send_mail(
'Django mail',
'This e-mail was sent with Django.',
'your_account@gmail.com',
['your_account@gmail.com'],
fail_silently=False)
python-social-auth¶
# settings.py
INSTALLED_APPS = (
...,
'social.apps.django_app.default',
)
# ========
# Facebook
# https://developers.facebook.com/apps/?action=create
# ========
AUTHENTICATION_BACKENDS += (
'social.backends.facebook.Facebook2OAuth2',
)
SOCIAL_AUTH_FACEBOOK_KEY = 'XXX'
SOCIAL_AUTH_FACEBOOK_SECRET = 'XXX'
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']
# =======
# Twitter
# https://apps.twitter.com/app/new
# =======
AUTHENTICATION_BACKENDS += (
'social.backends.twitter.TwitterOAuth',
)
SOCIAL_AUTH_TWITTER_KEY = 'XXX'
SOCIAL_AUTH_TWITTER_SECRET = 'XXX'
# =======
# Google
# https://console.developers.google.com/project
# =======
SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'XXX'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'XXX'
# urls.py
url(
'social-auth/',
include('social.apps.django_app.urls', namespace='social')),
<div class="social">
<ul>
<li class="facebook">
<a href="{% url "social:begin" "facebook" %}">
Sign in with Facebook</a></li>
<li class="twitter">
<a href="{% url "social:begin" "twitter" %}">
Login with Twitter</a></li>
<li class="google">
<a href="{% url "social:begin" "google" %}">
Login with Google</a></li>
</ul>
</div>
redis¶
redis-server - старт сервера redis-cli - консольное управление
pip install redis
# добавляем ключ в хранилище
127.0.0.1:6379> SET name "ilnurgi"
OK
# получаем значение ключа
127.0.0.1:6379> GET name
"ilnurgi"
# проверяем существование ключа
127.0.0.1:6379> EXISTS name
(integer) 1
# ключ удалится из хранилища через 2 секунды
127.0.0.1:6379> EXPIRE name 2
(integer) 1
127.0.0.1:6379> GET name
(nil)
127.0.0.1:6379> SET total 1
OK
127.0.0.1:6379> DEL total
(integer) 1
127.0.0.1:6379> GET total
(nil)
# views.py
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
r.set('foo', 'bar')
value = r.get('foo')
# увеличит значение на 1,
# если ключа нет то создаст со значением 0 и вернет увеличенное значение
value2 = r.incr('some_key')
# возвращает ключи словаря
# 0 - минимальное значение ключа
# -1 - максимальное значение,
# desc - обратная сортировка
value2 = r.zrange('some_key', 0, -1, desc=True)[:10]
celery¶
pip install celery
apt-get install rabbitmq
# pip install flower
# celery -A myshop flower
# celery -A myshop worker -l info
# celery.py
import os
from celery import Celery
from django.conf import settings
app = Celery('myshop')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
# tasks.py
from celery import task
from django.core.mail import send_mail
@task
def send_mail_task(some_arg):
# ...
return send_mail(subject, message, admin_email, [some_email])
# views.py
def some_view(request):
# ...
send_mail_task.delay(some_arg)
# ...
django-paypal¶
pip install django-paypal
# settings.py
INSTALLED_APPS = (
# ...
'paypal.standard.ipn',
)
PAYPAL_RECEIVER_EMAIL = 'mypaypalemail@myshop.com'
PAYPAL_TEST = True
# urls.py
url(r'^paypal/', include('paypal.standard.ipn.urls')),
# views.py
from decimal import Decimal
from django.conf import settings
from django.core.urlresolvers import reverse
from django.shortcuts import render, get_object_or_404
from paypal.standard.forms import PayPalPaymentsForm
from orders.models import Order
def payment_process(request):
order_id = request.session.get('order_id')
order = get_object_or_404(Order, id=order_id)
host = request.get_host()
paypal_dict = {
'business': settings.PAYPAL_RECEIVER_EMAIL,
'amount': (
'%.2f' % order.get_total_cost().quantize(Decimal('.01'))),
'item_name': 'Order {}'.format(order.id),
'invoice': str(order.id),
'currency_code': 'USD',
'notify_url': 'http://{}{}'.format(host, reverse('paypal-ipn')),
'return_url': 'http://{}{}'.format(host, reverse('payment:done')),
'cancel_return': (
'http://{}{}'.format(host, reverse('payment:canceled'))),
}
form = PayPalPaymentsForm(initial=paypal_dict)
return render(
request,
'payment/process.html',
{'order': order, 'form':form},
)
# signals.py
from django.shortcuts import get_object_or_404
from paypal.standard.models import ST_PP_COMPLETED
from paypal.standard.ipn.signals import valid_ipn_received
from orders.models import Order
def payment_notification(sender, **kwargs):
ipn_obj = sender
if ipn_obj.payment_status == ST_PP_COMPLETED:
# payment was successful
order = get_object_or_404(Order, id=ipn_obj.invoice)
# mark the order as paid
order.paid = True
order.save()
valid_ipn_received.connect(payment_notification)
translations¶
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy, ngettext, ngettext_lazy
output = _('Text to be translated.')
output = gettext_lazy('Text to be translated.')
output = ngettext(
'there is %(count)d product',
'there are %(count)d products',
count) % {'count': count}
test¶
# ускоряем тесты
import sys
TESTING = 'test' in sys.argv
if TESTING:
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.MD5PasswordHasher',
]