Помните, используйте timeit
модуль для тестирования, какой из маленьких отрывков кода быстрее!
$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop
Лично, я всегда использую .range()
, если я не имел дело с действительно огромные списки - как Вы видите, мудрый временем, для списка миллиона записей, дополнительные издержки составляют только 0,04 секунды. И поскольку Corey указывает, в Python 3.0 .xrange()
уйдет, и .range()
даст Вам хорошее поведение итератора так или иначе.
Вы не можете сделать это "из коробки" с фреймворк MVC. Помните, что есть разница между маршрутизацией и перезаписью URL. Маршрутизация - это отображение каждого запроса на ресурс, а ожидаемый ресурс - это фрагмент кода.
Однако гибкость инфраструктуры MVC позволяет вам делать это без каких-либо серьезных проблем. По умолчанию, когда вы вызываете routes.MapRoute ()
, он обрабатывает запрос с экземпляром MvcRouteHandler ()
. Вы можете создать пользовательский обработчик для обработки URL-адресов изображений.
Создайте класс, который может быть назван ImageRouteHandler, который реализует IRouteHandler
.
Добавьте сопоставление в ваше приложение следующим образом :
routes.Add ("ImagesRoute",
new ImageRouteHandler ()));
Вот и все.
Вот как выглядит ваш класс IRouteHandler
:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Compilation;
using System.Web.Routing;
using System.Web.UI;
namespace MvcApplication1
{
public class ImageRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string filename = requestContext.RouteData.Values["filename"] as string;
if (string.IsNullOrEmpty(filename))
{
// return a 404 HttpHandler here
}
else
{
requestContext.HttpContext.Response.Clear();
requestContext.HttpContext.Response.ContentType = GetContentType(requestContext.HttpContext.Request.Url.ToString());
// find physical path to image here.
string filepath = requestContext.HttpContext.Server.MapPath("~/test.jpg");
requestContext.HttpContext.Response.WriteFile(filepath);
requestContext.HttpContext.Response.End();
}
return null;
}
private static string GetContentType(String path)
{
switch (Path.GetExtension(path))
{
case ".bmp": return "Image/bmp";
case ".gif": return "Image/gif";
case ".jpg": return "Image/jpeg";
case ".png": return "Image/png";
default: break;
}
return "";
}
}
}
Если бы вы сделали это с помощью веб-форм ASP.NET 3.5 Sp1, вам пришлось бы создать отдельный ImageHTTPHandler, который реализует IHttpHandler для обработки ответа. По сути, все, что вам нужно сделать, это поместить код, который в настоящее время находится в методе GetHttpHandler, в метод ProcessRequest вашего ImageHttpHandler. Я бы также переместил метод GetContentType в класс ImageHTTPHandler. Также добавьте переменную для хранения имени файла.
Тогда ваш класс ImageRouteHanlder будет выглядеть так:
public class ImageRouteHandler:IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
string filename = requestContext.RouteData.Values["filename"] as string;
return new ImageHttpHandler(filename);
}
}
, а ваш класс ImageHttpHandler будет выглядеть так:
public class ImageHttpHandler:IHttpHandler
{
private string _fileName;
public ImageHttpHandler(string filename)
{
_fileName = filename;
}
#region IHttpHandler Members
public bool IsReusable
{
get { throw new NotImplementedException(); }
}
public void ProcessRequest(HttpContext context)
{
if (string.IsNullOrEmpty(_fileName))
{
context.Response.Clear();
context.Response.StatusCode = 404;
context.Response.End();
}
else
{
context.Response.Clear();
context.Response.ContentType = GetContentType(context.Request.Url.ToString());
// find physical path to image here.
string filepath = context.Server.MapPath("~/images/" + _fileName);
context.Response.WriteFile(filepath);
context.Response.End();
}
}
private static string GetContentType(String path)
{
switch (Path.GetExtension(path))
{
case ".bmp": return "Image/bmp";
case ".gif": return "Image/gif";
case ".jpg": return "Image/jpeg";
case ".png": return "Image/png";
default: break;
}
return "";
}
#endregion
}