Не удается отладить приложения Android

Добро пожаловать в Сообщество

Редактор переводов можно открыть следующим образом:

  1. Панель навигации (предварительный просмотр Android) >> app >> res >> Двойной щелчок «strings.xml» «
  2. В верхнем правом углу открытого окна strings.xml нажмите« Открыть редактор »

enter image description here

5
задан kiamlaluno 23 October 2012 в 12:19
поделиться

2 ответа

Обновление:

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

Во-первых, внутренний быстрый взгляд на платформу сессий:

  1. Когда новый посетитель запрашивает приложение URL, новая сессия сгенерирована для них - в этой точке, они являются все еще анонимными (request.user экземпляр AnonymousUser).
  2. Если они запрашивают представление, которое требует аутентификации, они перенаправляются к представлению входа в систему.
  3. Когда представление входа в систему требуют, оно устанавливает тестовое значение на сессии пользователя (SessionStore._session); это автоматически устанавливает accessed и modified флаги на текущей сессии.
  4. Во время фазы ответа вышеупомянутого запроса, SessionMiddleware сохраняет текущую сессию, эффективно создавая новое Session экземпляр в django_session таблица (если Вы используете значение по умолчанию поддержанные базой данных сессии, обеспеченные django.contrib.sessions.backends.db). Идентификатор новой сессии сохраняется в settings.SESSION_COOKIE_NAME cookie.
  5. Когда пользователь указывает их имя пользователя и пароль и отправляет форму, они аутентифицируются. Если аутентификация успешно выполняется, login метод от django.contrib.auth назван. login проверки, если текущая сессия содержит идентификатор пользователя; если это делает, и идентификатор совпадает с идентификатором зарегистрированного пользователя, SessionStore.cycle_key назван для создания нового сеансового ключа, при сохранении данных сессии. Иначе, SessionStore.flush назван, чтобы удалить все данные и генерировать новую сессию. Оба этих метода должны удалить предыдущую сессию (для анонимного пользователя), и вызов SessionStore.create создать новую сессию.
  6. На данном этапе пользователь аутентифицируется, и у них есть новая сессия. Их идентификатор сохраняется на сессии, наряду с бэкендом, используемым для аутентификации их. Промежуточное программное обеспечение сессии сохраняет эти данные к базе данных и сохраняет их новый идентификатор сессии в settings.SESSION_COOKIE_NAME.

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

Основываясь на предложении Alex Gaynor, я думаю, что придумал другой подход, который, кажется, делает то, что Вы спрашиваете, хотя это все еще немного грубо вокруг краев. В основном я использую второй долговечный "контрольный" cookie, для зеркального отражения идентификатора сессии и некоторого промежуточного программного обеспечения для проверки на присутствие того cookie. Для любого запроса:

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

Вот код до сих пор:

sessionaudit.middleware.py:

from django.conf import settings
from django.db.models import signals
from django.utils.http import cookie_date
import time

session_expired = signals.Signal(providing_args=['previous_session_key'])

AUDIT_COOKIE_NAME = 'sessionaudit'

class SessionAuditMiddleware(object):
    def process_request(self, request):
        # The 'print' statements are helpful if you're using the development server
        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
        audit_cookie = request.COOKIES.get(AUDIT_COOKIE_NAME, None)
        if audit_cookie is None and session_key is None:
            print "** Got new user **"
        elif audit_cookie and session_key is None:
            print "** User session expired, Session ID: %s **" % audit_cookie
            session_expired.send(self.__class__, previous_session_key=audit_cookie)
        elif audit_cookie == session_key:
            print "** User session active, Session ID: %s **" % audit_cookie

    def process_response(self, request, response):
        if request.session.session_key:
            audit_cookie = request.COOKIES.get(AUDIT_COOKIE_NAME, None)
            if audit_cookie != request.session.session_key:
                # New Session ID - update audit cookie:
                max_age = 60 * 60 * 24 * 365  # 1 year
                expires_time = time.time() + max_age
                expires = cookie_date(expires_time)
                response.set_cookie(
                    AUDIT_COOKIE_NAME,
                    request.session.session_key,
                    max_age=max_age,
                    expires=expires,
                    domain=settings.SESSION_COOKIE_DOMAIN,
                    path=settings.SESSION_COOKIE_PATH,
                    secure=settings.SESSION_COOKIE_SECURE or None
                )
        return response

audit.models.py:

from django.contrib.sessions.models import Session
from sessionaudit.middleware import session_expired

def audit_session_expire(sender, **kwargs):
    try:
        prev_session = Session.objects.get(session_key=kwargs['previous_session_key'])
        prev_session_data = prev_session.get_decoded()
        user_id = prev_session_data.get('_auth_user_id')
    except Session.DoesNotExist:
        pass

session_expired.connect(audit_session_expire)

settings.py:

MIDDLEWARE_CLASSES = (
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'sessionaudit.middleware.SessionAuditMiddleware',
    ...
)

INSTALLED_APPS = (
    ...
    'django.contrib.sessions',
    'audit',
    ...
)

При использовании этого необходимо реализовать пользовательское представление выхода из системы, которое явно удаляет контрольный cookie, когда пользователь выходит из системы. Кроме того, я предложил бы использовать django промежуточное программное обеспечение cookie со знаком (но Вы, вероятно, уже делаете это, не так ли?)

СТАРЫЙ:

Я думаю, что необходимо смочь сделать это использование пользовательского бэкенда сессии. Вот некоторый (непротестированный) пример кода:

from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.db.models import signals

session_created = signals.Signal(providing_args=['previous_session_key', 'new_session_key'])

class SessionStore(DBStore):
    """
    Override the default database session store.

    The `create` method is called by the framework to:
    * Create a new session, if we have a new user
    * Generate a new session, if the current user's session has expired

    What we want to do is override this method, so we can send a signal
    whenever it is called.
    """

    def create(self):
        # Save the current session ID:
        prev_session_id = self.session_key
        # Call the superclass 'create' to create a new session:
        super(SessionStore, self).create()
        # We should have a new session - raise 'session_created' signal:
        session_created.send(self.__class__, previous_session_key=prev_session_id, new_session_key=self.session_key)

Сохраните код выше как 'customdb.py' и добавьте это к своему django проекту. В Вашем settings.py, наборе или замене 'SESSION_ENGINE' с путем к вышеупомянутому файлу, например:

SESSION_ENGINE = 'yourproject.customdb'

Затем в Вашем промежуточном программном обеспечении или models.py, обеспечивают обработчик для сигнала 'session_created', как так:

from django.contrib.sessions.models import Session
from yourproject.customdb import session_created

def audit_session_expire(sender, **kwargs):
    # remember that 'previous_session_key' can be None if we have a new user
    try:
        prev_session = Session.objects.get(kwargs['previous_session_key'])
        prev_session_data = prev_session.get_decoded()
        user_id = prev_session_data['_auth_user_id']
        # do something with the user_id
    except Session.DoesNotExist:
        # new user; do something else...

session_created.connect(audit_session_expire)

Не забывайте включать приложение, содержащее models.py в INSTALLED_APPS.

9
ответ дан 13 December 2019 в 22:17
поделиться

Я не знаю о Django, но можете Вы, просто создавать нестойкий cookie, который хранит прошлое время доступа к странице на Вашем сайте (Вы обновляете cookie на каждой загрузке страницы),

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

0
ответ дан 13 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: