Django Application Zum Loggen - PullRequest
       1

Django Application Zum Loggen

0 голосов
/ 13 октября 2011

Допустим, у меня есть две модели:

class Thinclient(models.Model):
    hostname = models.TextField(_('hostname'),unique=True, \
        editable=False)
    logs = models.ManyToManyField(Log, blank=True, null=True)

class Log(models.Model):
    logname = models.TextField(editable=False)
    created = models.DateTimeField(auto_now_add=True, editable=False)

Как видите, у меня тонкие клиенты. Теперь, если один из этих тонких клиентов загружается, он должен отправить POST-запрос в мое приложение с именем тонкого клиента и именем журнала (т. Е. "Загрузка ...").

Теперь мой взгляд справится со всей работой, и в этом моя проблема. В настоящее время это выглядит так:

def log(request):
    if request.method == 'POST':
        form = ThinclientForm(request.POST)
        if form.is_valid():
            message = form.cleaned_data['logname']
            Log.objects.get_or_create(logname=message)
            return HttpResponse(content="", mimetype=None, status=200)
        else:
            return HttpResponse(content="Unsuccessful", mimetype=None,
                status=400)

        return render_to_response('thin/status', {
            'form': form, })

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

Я надеюсь, что смогу объяснить, что мне нужно знать, если не сказать мне. И Спасибо за любую помощь в этом

Ответы [ 2 ]

0 голосов
/ 13 октября 2011

Здесь есть несколько проблем.Первый заключается в дизайне ваших моделей.Ссылка от Log до ThinClient должна быть ForeignKey от Log до ThinClient

class Thinclient(models.Model):
    hostname = models.TextField(_('hostname'),unique=True, \
        editable=False)

class Log(models.Model):
    thin_client = models.ForeignKey(Thinclient)
    logname = models.TextField(editable=False)
    created = models.DateTimeField(auto_now_add=True, editable=False)

Вам даже нужна форма здесь?Разве ваши тонкие клиенты не делают пост на этот URL?Они действительно делают GET, чтобы получить форму?Преимуществом форм является возможность превращать их в HTML и проверять данные.Я не думаю, что вам нужно что-то из этого.

Имя хоста удаленного клиента хранится в заголовке запроса REMOTE_HOST, так что вы можете использовать его для извлечения.

В качестве примечания вы всегда должны возвращать некоторый контент.Некоторые прокси не любят отклики с нулевым байтом.Вы также должны всегда указывать mimetype, даже если это значение по умолчанию text / html.

0 голосов
/ 13 октября 2011

Предполагая, что ваше имя Thinclient также включено в POST, вы можете просто взять его оттуда и использовать для поиска фактического объекта, а затем назначить ему это сообщение журнала.

log = Log.objects.get_or_create(logname=message)
client = Thinclient.objects.get(hostname=request.POST['clientname']
client.logs.add(log)

(Одно примечание: вам не следует использовать TextFields для таких вещей, как имена клиентов - они хранятся в базе данных как объекты BLOB / TEXT, что гораздо менее эффективно, чем обычные VARCHAR. Вместо этого используйте CharField.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...