Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 3, 2012 19:54:14

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Как безопасно записать в БД?

Ребята, подскажите. Есть модель для сохранения адреса страницы, e-mail и даты создания.

class Adresa(models.Model):
    email = models.EmailField()
    adres = models.URLField()
    crdata = models.DateField()
    
    def __unicode__(self):
	return self.adres 

Есть форма, запрашивающая данные у пользователя для последующего добавления в базу.

class AdrForm(forms.Form):
    email = forms.EmailField()
    adres = forms.URLField()
    crdate = forms.DateField()

Вопрос: как безопасно добавлять в базу данные, полученнве от пользователя, то есть нужно ли как-то обработать, экранировать и т.д.?

В функции представления делаю примерно так:
def addadres(request):
    if request.method == 'POST':
        form = AdrForm(request.POST)
        if form.is_valid():
	  
	    cd = form.cleaned_data
	    a = Adresa(email=cd['email'], adres=cd['adres'], crdata=datetime.now())
	    a.save()
	    return HttpResponseRedirect('/thanks/')
	
    else:
        form = AdrForm()
    return render_to_response('addadres.html',{'form': form})
 

Работать работает, но необходимость дополнительной обработки вызывает определенное беспокойство.

Офлайн

#2 Сен. 4, 2012 05:36:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как безопасно записать в БД?

А зачем Вам простая форма, если она целиком повторяет модель? Делайте ModelForm.
ModelForm тынц



Офлайн

#3 Сен. 4, 2012 13:18:56

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Как безопасно записать в БД?

FishHook, действительно ModelForm подходит больше. Как я понял, дополнительна экранировка символов перед сохранением в базе не требуется? Когда я пробовал, то в поле типа URLField запросто разрешается ставить одинарные и двойные кавычки, их не нужно дополнительно обрабатывать?

И ещё вопрос: при использовании ModelForm можно как-то выполнять предварительную обработку поля до того, как оно запишется в БД?

Офлайн

#4 Сен. 4, 2012 13:35:30

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как безопасно записать в БД?

digi
FishHook, действительно ModelForm подходит больше. Как я понял, дополнительна экранировка символов перед сохранением в базе не требуется? Когда я пробовал, то в поле типа URLField запросто разрешается ставить одинарные и двойные кавычки, их не нужно дополнительно обрабатывать?

И ещё вопрос: при использовании ModelForm можно как-то выполнять предварительную обработку поля до того, как оно запишется в БД?
Переопредели в форме def _clean_fields(self)

Вот кусок говнокода для примера
class OrphanChildLegalState(ModelForm):
    def __init__(self, *args, **kw):
        super(OrphanChildLegalState, self).__init__(*args, **kw)
        self.child=kw.get('instance')
        if self.child.get_age>=18:
            choices=[('%s_%s' % ('A', x[0]),x[1]) for x in  Child.ORPHAN_REASONS]
            choices+=[('%s_%s' % ('B', x[0]),x[1]) for x in  Child.NON_TRUSTEE_REASONS]
            choices.insert(0, (None,'------'))
            common_field=forms.ChoiceField(choices=choices, label=u'Причина получения правового статуса')
            self.fields={'common_field':common_field}
            legal_status=self.child.legal_status
            reason=self.child.orphan_reason or self.child.non_trustee_reason
            self.initial.update({'common_field':'%s_%s' %(legal_status, reason)})
    def _clean_fields(self):
         super(OrphanChildLegalState, self)._clean_fields()
         if self.cleaned_data.get('common_field'):
             c_f=self.cleaned_data['common_field']
             legal_status, reason=c_f.split('_') if c_f!='None' else (None,None)
             self.cleaned_data.update({'legal_status':legal_status})
             if legal_status=="A":
                 self.cleaned_data.update({'orphan_reason':reason})
             elif legal_status=="B":
                 self.cleaned_data.update({'non_trustee_reason':reason})
             else:
                 self.cleaned_data.update({'non_trustee_reason':None,'orphan_reason':None, })
    class Meta:
        model=Child
        fields = ('legal_status','orphan_reason', 'non_trustee_reason')



Офлайн

#5 Сен. 17, 2012 19:16:19

digi
Зарегистрирован: 2012-08-16
Сообщения: 32
Репутация: +  1  -
Профиль  

Как безопасно записать в БД?

FishHook, именно так и сделал, спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version