В моем случае (у меня была та же проблема), но было неуместно использовать привязку к свойству IsSelected объекта Data, а также я не мог легко получить путь к элементу дерева, поэтому следующий код отлично справился с задачей:
private void SelectTreeViewItem(object item)
{
try
{
var tvi = GetContainerFromItem(this.MainRegion, item);
tvi.Focus();
tvi.IsSelected = true;
var selectMethod =
typeof(TreeViewItem).GetMethod("Select",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
selectMethod.Invoke(tvi, new object[] { true });
}
catch { }
}
private TreeViewItem GetContainerFromItem(ItemsControl parent, object item)
{
var found = parent.ItemContainerGenerator.ContainerFromItem(item);
if (found == null)
{
for (int i = 0; i < parent.Items.Count; i++)
{
var childContainer = parent.ItemContainerGenerator.ContainerFromIndex(i) as ItemsControl;
TreeViewItem childFound = null;
if (childContainer != null && childContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
{
childContainer.ItemContainerGenerator.StatusChanged += (o, e) =>
{
childFound = GetContainerFromItem(childContainer, item);
};
}
else
{
childFound = GetContainerFromItem(childContainer, item);
}
if (childFound != null)
return childFound;
}
}
return found as TreeViewItem;
}
Итак, поиск я нашел эту ветку обсуждения.
Было сказано, что вас могут заинтересовать три вещи in.
Сначала идет метод mod_python
Затем идет метод mod_wsgi
Оба варианта кажутся не такими уж хорошими.
Лучше заголовок X-Sendfile который не является полностью стандартным, но работает, по крайней мере, в apache и lighttpd.
kibbitzing из здесь , у нас есть следующее.
@login_required
def serve_file(request, context):
if <check if they have access to the file>:
filename = "/var/www/myfile.xyz"
response = HttpResponse(mimetype='application/force-download')
response['Content-Disposition']='attachment;filename="%s"'%filename
response["X-Sendfile"] = filename
response['Content-length'] = os.stat("debug.py").st_size
return response
return <error state>
, и это должно быть почти то, что вам нужно.Просто убедитесь, что вы включили поддержку X-Sendfile во всем, что вы используете.
XSendfile кажется правильным подходом, но выглядит немного сложным в настройке . Я решил использовать более простой способ.
Основываясь на ответе emeryc и фрагментах django http://www.djangosnippets.org/snippets/365/ , я написал следующий код, и кажется чтобы сделать то, что я хочу:
@login_required
def serve_file(request, filename):
fullname = myapp.settings.PRIVATE_AREA+filename
try:
f = file(fullname, "rb")
except Exception, e:
return page_not_found(request, template_name='404.html')
try:
wrapper = FileWrapper(f)
response = HttpResponse(wrapper, mimetype=mimetypes.guess_type(filename)[0])
response['Content-Length'] = os.path.getsize(fullname)
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
return response
except Exception, e:
return page_not_found(request, template_name='500.html')
Существует множество руководств о том, как включить аутентификацию в Django. Вам нужна помощь? Если да, запустите здесь .
Следующим шагом является создание представления, в котором перечислены ваши файлы. Так что сделайте это, это все базовый Django. Если у вас возникли проблемы с этим шагом, вернитесь и просмотрите учебник Django . Вы получите это.
Наконец, вернитесь к первой ссылке (здесь снова: аутентификационные документы ) и внимательно посмотрите на декоратор LOGIN_REQUIRED. Защитите свой вид с помощью этого декоратора.
Это все довольно простые вещи Django. Если вы сделали это и у вас есть конкретный вопрос , разместите его здесь. Но вы задаете SO довольно открытый вопрос, и это не лучший способ получить помощь.