Архивы по Категориям: Новости - Page 5

Расширение профиля пользователя django

в Django я по прежнему новичок, но что-то стараюсь понять и запомнить.

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

но как-то оно получилось, попробую собрать все мысли в кучу в эту статью.

Многие знают о django-registration и вот от автора этого замечательного приложения существует django-profiles котором я и воспользовался.

устанавливаем django-profiles

easy_install django-profiles

в models.py создадим модель профиля, которая наследуется от штатной User и добавим в ней нужное нам поле

from django.contrib.auth.models import User
...
...
class UserProfile(models.Model):
    # поле для связки со встроенной моделью пользователя Django
    user = models.ForeignKey(User, unique=True)
    # наше новое поле
    about = models.TextField(blank=True)

Далее в settings.py надо указать кто будет новым AUTH_PROFILE_MODULE

AUTH_PROFILE_MODULE = 'list.UserProfile'

где list это ваше приложение в котором расположена модель расширяющая пользователя

в принципе на этом можно закончить, ибо обращаться теперь можно к

{{ user.get_profile.about }}

только нужно обратить внимание что надо пользоваться не context а RequestContext
и указать это в
TEMPLATE_CONTEXT_PROCESSORS файла settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
     ...
     'django.contrib.auth.context_processors.auth',
     ...
     )

но мы идём дальше

Теперь нам надо подключить django-profiles для просмотра\редактирования профиля

в файле urls.py
подключаем

    ...
    (r'^profiles/', include('profiles.urls')),
    ...

в settings.py также подключим приложение

INSTALLED_APPS = (
     ...
     'profiles',
     )

теперь создадим таблицы в базе

python manage.py syncdb

приложение profiles использует вот такие шаблоны

    profiles/create_profile.html
    profiles/edit_profile.html
    profiles/profile_detail.html
    profiles/profile_list.html

по названию понятно что к чему

для начала отредактируем edit_profile.html

{% extends "base.html" %}
{% block title %}Edit Profile{% endblock %}
 
{% block content %}
<h1>Edit contact info for {{ user }} </h1>
 
<form method="POST" action="">
    {{ form }}
    <input type="submit" name="submit" value="Update" id="submit">
</form>
 
{% endblock content %}

сохраняем, теперь можно обратиться к /profiles/edit/ то должно открыться форма редактирования профиля.

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

создаём класс формы, наследуемой от общей формы, в котором перечисляем, то что нам исключить от вывода пользователю
forms.py

from django.db import models
from django.forms import ModelForm
from PROJ.apps.APP.models import UserProfile

.........
class ProfileForm(forms.ModelForm):
  class Meta:
      model = UserProfile
      exclude = ('user','last_name',)

from PROJ.apps.APP.models import UserProfile
проект и приложение где расположена расширенная модель

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

from PROJ.APP.forms import ProfileForm
........
    ('^profiles/edit', 'profiles.views.edit_profile', {'form_class': ProfileForm,}),
    (r'^profiles/', include('profiles.urls')),
.......

Должно получиться примерно так.. проверяем на странице редактирования профиля (/profiles/edit/).

Теперь сделаем страницу отображения профиля profile/profile_detail.html

вывести можно что угодно из профиля вот так

<p><strong>Address 2:</strong><br>{{ profile.address2 }}</p>

где address2 это дополнительное поле
список пользователей с профилями можно вывести вот так

profiles/profile_list.html

{% extends "base.html" %}
{% block content %}
<h1>Список пользователей</h1>
<br/><br/>
    {% for p in object_list  %}
<a href="{% url profiles_profile_detail p.user %}">{{ p.user }}</a>
{% endfor %}
{% endblock %}

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

в models.py добавим

from django.db.models import signals
from bucket.signals import create_profile
 
# When model instance is saved, trigger creation of corresponding profile
signals.post_save.connect(create_profile, sender=User)

создадим файл, если он не создан signals.py:

def create_profile(sender, instance, signal, created, **kwargs):
    """When user is created also create a matching profile."""

    from PROJ.apps.APP.models import UserProfile

    if created:
        UserProfile(user = instance).save()
        # Do additional stuff here if needed, e.g.
        # create other required related records

вот и всё, при регистрации нового пользователя автоматически будет создаваться к нему профиль, если у вас уже сейчас много пользователей, то создать для каждого профиль можно вот так

$ python manage.py shell
 
from django.contrib.auth.models import User
from bucket.models import Profile
 
users = User.objects.all()
for u in users:
     try:
          p = u.get_profile()
     except p.DoesNotExist:
          Profile(user = u).save()

ещё коснусь вопроса редактирования своего email в профиль, пока ещё не совсем разобрался с этим.

пока есть только пример, делается это анналогично через forms.py

class ProfileForm(ModelForm):
 
    def __init__(self, *args, **kwargs):
        super(ProfileForm, self).__init__(*args, **kwargs)
        try:
            self.fields['email'].initial = self.instance.user.email
            # self.fields['first_name'].initial = self.instance.user.first_name
            # self.fields['last_name'].initial = self.instance.user.last_name
        except User.DoesNotExist:
            pass
 
    email = forms.EmailField(label="Primary email",help_text='')
 
    class Meta:
      model = Profile
      exclude = ('user',)        
 
    def save(self, *args, **kwargs):
        """
        Update the primary email address on the related User object as well.
        """

        u = self.instance.user
        u.email = self.cleaned_data['email']
        u.save()
        profile = super(ProfileForm, self).save(*args,**kwargs)
        return profile

надеюсь вернусь к этому вопросу

fsck.ext4: Memory allocation failed while retrying to read bitmaps for /dev/md0 e2fsck: aborted

Вот такой заголовок текст мне кинул мой NAS на debian выполняющий роль Бэкап хранилища…

fsck.ext4: Memory allocation failed while retrying to read bitmaps for /dev/md0 e2fsck: aborted

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

так вот гугл толком ничгео не сказал, но если прочитать сообщение стало понятно, что он не смог вгрузить битовую карту 4Тб хранилища из-за мелкого размера оперативки(500) и swap(100!!!)
Хотя разметку диска дебиан делал автоматически.
так вот ладно грузимся дальше начинаем понимать, вижу что кончается опера и ивсё виснет htop не успевает показать что swap тоже кончается, пробую увеличить swap

создаю файл на 1Гб

dd if=/dev/zero of=/swapfile ibs=10485760 count=100

создаю файловую систему

mkswap /swapfile

подключаю новый файл как файл подкачки

swapon /swapfile

вот так смотрю что у меня с подкачкой?

# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda5                               partition       92152   37880   -1
/swapfile                               file            981296  144     -2

ну и всё запускаю заново проверку FS и она продолжается успешно…

Маленькая точка в SAPE

И так, господа, покажу вам ацки мотивирующий скрин с моей учётки в сапе.

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

кто-то скажет мало, кто-то скажет много. каждый решит сам.

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

linux да интерфейса (linux два провайдера)

Как и обещал, пишу.
Довольно много времени потратил на понимание происходящего..

И так есть у меня сервер, он же ОпенВПН сервер в одной организации. и вот упёрлась организация в ширину канала, собственно беда в том, что по этому же каналу ходил SIP трафик, и сильно «лагал» когда ширины канала не хватало :(

Подключаем ещё один канал от второго провайдера. есть сервер в нём внешний канал (eth1), локальная сеть(eth0), ещё ходит OpenVPN (tun0) для связи с остальными филиалами.

Добавился ещё один внешний провайдер (eth4). для его подключение я сделал так.
Напомню, что linux умеет работать с несколькими таблицами маршрутизации

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

в файл

 /etc/iproute2/rt_tables

Добавил 2 таблицы

 201 T1
 202 T2

У каждого провайдера будет своя таблица маршрутизация
Т1 – первый провайдер
Т2 – второй

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

#!/bin/sh
 IP1=217.111.111.99
 IP2=94.11.111.81
 P1=217.111.111.97
 P2=94.11.111.82
 IF1=eth1
 IF2=eth4
# добавим дефаулт гетвей в каждую таблицу.
 ip route add default via $P1 table T1
 ip route add default via $P2 table T2
# Говорим, что по дефолту будем ходить через первого провайдера.
 ip route add default via $P1
 ip rule add from $IP1 table T1
 ip rule add from $IP2 table T2
#Перечисляю хосты, что будут ходить через новый интерфейс вот так
#Но не забываем их указывать в NAT iptables
ip rule add from 192.168.5.107 table T2
ip rule add from 192.168.5.108 table T2
ip rule add from 192.168.5.112 table T2
ip rule add from 192.168.5.199 table T2  
#Это так на всякий случай
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

Где
IP# это ИП адрес на интерфейсе,
P# шлюз на интерфейсе
после этого сервер отвечает по обоим интерфейсам. также пинги/трацерты с сервера ходят через нужный интерфейс.

 ping -I eth4 ya.ru

теперь мне нужно что нужные мне клиенты ходили через этот интерфейс наружу. в iptables.up.rules у меня есть правила НАТа

-A POSTROUTING -s 192.168.5.102 -o eth4 -j MASQUERADE
-A POSTROUTING -s 10.10.10.6 -o eth4 -j MASQUERADE
-A POSTROUTING -s 192.168.0.0/255.255.0.0 -o eth1 -j MASQUERADE
-A POSTROUTING -s 10.10.0.0/255.255.0.0 -o eth1 -j MASQUERADE

первыми 2мя строками я хочу чтоб вот 192.168.5.102 и 10.10.10.6 НАТились через нового провайдера. rp_filter выключаем вот так в sysctrl

net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0

Теперь, надо понимать, что если идёт пакет на 192.168.5.108, то он попадает в таблицу T2 а в ней у нас что? правильно один только дефаултгетвей! а что такое другие подсети филиалов и ОпенВПН мы знать не знаем, поэтому тоже необходимо добавить маршрут в таблицу Т2 для указания где у нас ходятся 10.10.10.0

ip route add 10.10.10.0/24 via 10.10.10.2 dev tun0 table T2

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

Пассивное охлажедние

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

Но зато, решил я построить систему максимально бесшумную.

ещё когда-то давно, я купил Zalman 7000Cu, ещё студентом отдал за него 1к рублей, в месяц у меня был оборот 4 тысячи!!!

Тогда и посетила мысль, что всё таки ооочень тихие куллеры бывают!

и вот имея, немного свободных вебманий, штурмую местные инет магазины, в поисках самого тихого куллера :)

Очень понравился Scythe Yasya (SCYS-1000)

Это такая хрень
Вентилятор
Он реально огромный, но вот досада, в тырнетах пишут что он работает от 450- оборотов.
Но а в жизни меньше 1000 я заставить его не смог, может быть в биосе стоит контроль, который надо отключить :)

Но идём на смелый эксперимент.
оставляю корпус открытый, чтоб теплу был выход. отключаю вентилятор. и запускаю стресс тест от Эвереста.

Вот видим результаты. 10 минут комп стоит в стресс тесте, это 100% нагрузка на память, на проц.
Видим как температура медленно ползёт в гору, но замирает на отметке 50 градусов, далее выключаем нагрузку, температура возвращается в свои круги 28-30, при условии, что сейчас на улице +26 градусов, дома в районе 24-25ти.

ну и напоследок включаем вентилятор на место, температура мгновенно падает до комнатной температуры.

процессор у меня не самый горячий, и не самый новый.
Intel C2D E6750 (4M Cache, 2.66 GHz, 1333 MHz FSB).

Я считаю это очень круто, сейчас присматриваю, что есть из пассивного на видео карту, у меня она GeForce 8500GT с малюсеньким вентилятором.

дальше 2 варианта событий, у меня остаётся только блок питания, и корпус всегда открыт.
либо я ставлю блок питания как вытяжка всего из корпуса, и перед 3мя HDD (хотя разумнее их на помойку и купить один WD Green )в моём компе ставлю кулер на 12 см. получаем у нас есть вход и выход, правда БП нужен будет весь дырявый с одним большим 12см вентилятором, я думаю хватит, чтоб продувать воздух через весь системник.

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

Страница 5 из 11« Первая...3456710...Последняя »