def device_from_request(request):
    """
    Determine's the device name from the request by first looking for an
    overridding cookie, and if not found then matching the user agent.
    Used at both the template level for choosing the template to load and
    also at the cache level as a cache key prefix.
    """
    from django.conf import settings
    try:
        for device, _ in settings.DEVICE_USER_AGENTS:
            if device == request.COOKIES['scoffold-device']:
                return device
    except KeyError:
        try:
            user_agent = request.META['HTTP_USER_AGENT'].lower()
        except KeyError:
            pass
        else:
            try:
                user_agent = user_agent.decode('utf-8')
            except (AttributeError, UnicodeDecodeError):
                pass
            for device, ua_strings in settings.DEVICE_USER_AGENTS:
                for ua_string in ua_strings:
                    if ua_string.lower() in user_agent:
                        return device
    return ''
