Вы могли просто записывать данные в файл, открытый в двоичном режиме:
with open('filename', 'wb') as f:
for row in cursor:
f.write(row[2])
f.write(b'\n')
Однако обратите внимание, что ваш столбец resumeData
содержит UTF -8 BOM ; вы можете сначала удалить это:
import codecs
with open('filename', 'wb') as f:
for row in cursor:
resumeData = row[2]
if resumeData.startswith(codecs.BOM_UTF8):
resumeData = resumeData[3:]
f.write(row[2])
, чтобы предотвратить загрязнение файла повторяющимися символами спецификации (которые действительно не нужны с UTF-8).
Другой вариант для декодирования ваших данных и записи в файл в текстовом режиме:
with open('filename', 'w') as f:
for row in cursor:
f.write(row[2].decode('utf-8-sig')
f.write(b'\n')
, где utf-8-sig
- это кодек, который ожидает спецификацию UTF-8 (но не будет жаловаться, если он отсутствует).
Если вы хотите записать один файл на строку , откройте новые файловые объекты:
for row in cursor:
with open(row[1], 'wb') as f:
f.write(row[2])
снова как двоичный файл, чтобы вам не пришлось беспокоиться о какой кодек использует столбец.
SQLiteSpy - хороший выбор
-121--1173455-Этот заинтересовал меня, и у меня наконец появился шанс взглянуть на это. Другие люди, очевидно, не понимали, что это проблема с поиском представления , а не проблема с самой маршрутизацией - и это, вероятно, потому, что заголовок вашего вопроса указывает на то, что речь идет о маршрутизации.
В любом случае, поскольку это проблема, связанная с видом, единственный способ получить то, что вы хотите, это переопределить механизм просмотра по умолчанию . Обычно, когда вы делаете это, это для простой цели переключения вашего механизма просмотра (т.е. на Spark, NHaml и т.д.). В этом случае нам нужно переопределить не логику создания View, а методы FindPartityView
и FindView
в классе VirtureStartProviveViewEngine
.
Вы можете поблагодарить ваших счастливых звезд, что эти методы на самом деле виртуальны, потому что все остальное в VirturePath ProviveViewEngine
даже недоступно - он является частным, и это делает очень раздражает, чтобы переопределить логику поиска, потому что вы должны в основном переписать половину кода, который уже был написан, если вы хотите, чтобы он хорошо играть с кэшем местоположения и форматов местоположения. После некоторого копания в Reflector мне наконец удалось придумать рабочее решение.
То, что я сделал здесь, чтобы сначала создать абстрактный AreaFormViewEngine
, который происходит непосредственно из VirturePath ProviveViewEngine
вместо WebFormViewEngine
. Я сделал это, чтобы, если вы хотите создать Spark представления вместо (или что-то еще), вы по-прежнему можете использовать этот класс в качестве базового типа.
Код, приведенный ниже, является довольно длинным, поэтому, чтобы дать вам краткое резюме того, что он на самом деле делает: Он позволяет поместить {2}
в формат местоположения, который соответствует имени области, тот же путь {1}
соответствует имени контроллера. Именно! Это то, для чего мы должны были написать весь этот код:
public abstract class BaseAreaAwareViewEngine : VirtualPathProviderViewEngine
{
private static readonly string[] EmptyLocations = { };
public override ViewEngineResult FindView(
ControllerContext controllerContext, string viewName,
string masterName, bool useCache)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (string.IsNullOrEmpty(viewName))
{
throw new ArgumentNullException(viewName,
"Value cannot be null or empty.");
}
string area = getArea(controllerContext);
return FindAreaView(controllerContext, area, viewName,
masterName, useCache);
}
public override ViewEngineResult FindPartialView(
ControllerContext controllerContext, string partialViewName,
bool useCache)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
if (string.IsNullOrEmpty(partialViewName))
{
throw new ArgumentNullException(partialViewName,
"Value cannot be null or empty.");
}
string area = getArea(controllerContext);
return FindAreaPartialView(controllerContext, area,
partialViewName, useCache);
}
protected virtual ViewEngineResult FindAreaView(
ControllerContext controllerContext, string areaName, string viewName,
string masterName, bool useCache)
{
string controllerName =
controllerContext.RouteData.GetRequiredString("controller");
string[] searchedViewPaths;
string viewPath = GetPath(controllerContext, ViewLocationFormats,
"ViewLocationFormats", viewName, controllerName, areaName, "View",
useCache, out searchedViewPaths);
string[] searchedMasterPaths;
string masterPath = GetPath(controllerContext, MasterLocationFormats,
"MasterLocationFormats", masterName, controllerName, areaName,
"Master", useCache, out searchedMasterPaths);
if (!string.IsNullOrEmpty(viewPath) &&
(!string.IsNullOrEmpty(masterPath) ||
string.IsNullOrEmpty(masterName)))
{
return new ViewEngineResult(CreateView(controllerContext, viewPath,
masterPath), this);
}
return new ViewEngineResult(
searchedViewPaths.Union<string>(searchedMasterPaths));
}
protected virtual ViewEngineResult FindAreaPartialView(
ControllerContext controllerContext, string areaName,
string viewName, bool useCache)
{
string controllerName =
controllerContext.RouteData.GetRequiredString("controller");
string[] searchedViewPaths;
string partialViewPath = GetPath(controllerContext,
ViewLocationFormats, "PartialViewLocationFormats", viewName,
controllerName, areaName, "Partial", useCache,
out searchedViewPaths);
if (!string.IsNullOrEmpty(partialViewPath))
{
return new ViewEngineResult(CreatePartialView(controllerContext,
partialViewPath), this);
}
return new ViewEngineResult(searchedViewPaths);
}
protected string CreateCacheKey(string prefix, string name,
string controller, string area)
{
return string.Format(CultureInfo.InvariantCulture,
":ViewCacheEntry:{0}:{1}:{2}:{3}:{4}:",
base.GetType().AssemblyQualifiedName,
prefix, name, controller, area);
}
protected string GetPath(ControllerContext controllerContext,
string[] locations, string locationsPropertyName, string name,
string controllerName, string areaName, string cacheKeyPrefix,
bool useCache, out string[] searchedLocations)
{
searchedLocations = EmptyLocations;
if (string.IsNullOrEmpty(name))
{
return string.Empty;
}
if ((locations == null) || (locations.Length == 0))
{
throw new InvalidOperationException(string.Format("The property " +
"'{0}' cannot be null or empty.", locationsPropertyName));
}
bool isSpecificPath = IsSpecificPath(name);
string key = CreateCacheKey(cacheKeyPrefix, name,
isSpecificPath ? string.Empty : controllerName,
isSpecificPath ? string.Empty : areaName);
if (useCache)
{
string viewLocation = ViewLocationCache.GetViewLocation(
controllerContext.HttpContext, key);
if (viewLocation != null)
{
return viewLocation;
}
}
if (!isSpecificPath)
{
return GetPathFromGeneralName(controllerContext, locations, name,
controllerName, areaName, key, ref searchedLocations);
}
return GetPathFromSpecificName(controllerContext, name, key,
ref searchedLocations);
}
protected string GetPathFromGeneralName(ControllerContext controllerContext,
string[] locations, string name, string controllerName,
string areaName, string cacheKey, ref string[] searchedLocations)
{
string virtualPath = string.Empty;
searchedLocations = new string[locations.Length];
for (int i = 0; i < locations.Length; i++)
{
if (string.IsNullOrEmpty(areaName) && locations[i].Contains("{2}"))
{
continue;
}
string testPath = string.Format(CultureInfo.InvariantCulture,
locations[i], name, controllerName, areaName);
if (FileExists(controllerContext, testPath))
{
searchedLocations = EmptyLocations;
virtualPath = testPath;
ViewLocationCache.InsertViewLocation(
controllerContext.HttpContext, cacheKey, virtualPath);
return virtualPath;
}
searchedLocations[i] = testPath;
}
return virtualPath;
}
protected string GetPathFromSpecificName(
ControllerContext controllerContext, string name, string cacheKey,
ref string[] searchedLocations)
{
string virtualPath = name;
if (!FileExists(controllerContext, name))
{
virtualPath = string.Empty;
searchedLocations = new string[] { name };
}
ViewLocationCache.InsertViewLocation(controllerContext.HttpContext,
cacheKey, virtualPath);
return virtualPath;
}
protected string getArea(ControllerContext controllerContext)
{
// First try to get area from a RouteValue override, like one specified in the Defaults arg to a Route.
object areaO;
controllerContext.RouteData.Values.TryGetValue("area", out areaO);
// If not specified, try to get it from the Controller's namespace
if (areaO != null)
return (string)areaO;
string namespa = controllerContext.Controller.GetType().Namespace;
int areaStart = namespa.IndexOf("Areas.");
if (areaStart == -1)
return null;
areaStart += 6;
int areaEnd = namespa.IndexOf('.', areaStart + 1);
string area = namespa.Substring(areaStart, areaEnd - areaStart);
return area;
}
protected static bool IsSpecificPath(string name)
{
char ch = name[0];
if (ch != '~')
{
return (ch == '/');
}
return true;
}
}
Теперь, как сказано, это не конкретный двигатель, так что вы должны создать и это. Эта часть, к счастью, намного проще, все, что нам нужно сделать, это установить форматы по умолчанию и фактически создать ракурсы:
public class AreaAwareViewEngine : BaseAreaAwareViewEngine
{
public AreaAwareViewEngine()
{
MasterLocationFormats = new string[]
{
"~/Areas/{2}/Views/{1}/{0}.master",
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.master",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Views/{1}/{0}.master",
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.master"
"~/Views/Shared/{0}.cshtml"
};
ViewLocationFormats = new string[]
{
"~/Areas/{2}/Views/{1}/{0}.aspx",
"~/Areas/{2}/Views/{1}/{0}.ascx",
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.aspx",
"~/Areas/{2}/Views/Shared/{0}.ascx",
"~/Areas/{2}/Views/Shared/{0}.cshtml",
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.aspx"
"~/Views/Shared/{0}.ascx"
"~/Views/Shared/{0}.cshtml"
};
PartialViewLocationFormats = ViewLocationFormats;
}
protected override IView CreatePartialView(
ControllerContext controllerContext, string partialPath)
{
if (partialPath.EndsWith(".cshtml"))
return new System.Web.Mvc.RazorView(controllerContext, partialPath, null, false, null);
else
return new WebFormView(controllerContext, partialPath);
}
protected override IView CreateView(ControllerContext controllerContext,
string viewPath, string masterPath)
{
if (viewPath.EndsWith(".cshtml"))
return new RazorView(controllerContext, viewPath, masterPath, false, null);
else
return new WebFormView(controllerContext, viewPath, masterPath);
}
}
Обратите внимание, что мы добавили несколько записей в стандартный ViewLocationFormats
. Это новые записи {2}
, где {2}
будет сопоставлено с областью
, помещенной в RoiveData
. Я оставил MasterLocationFormats
в покое, но, очевидно, вы можете изменить это, если хотите.
Теперь изменить ваш global.asax
, чтобы зарегистрировать этот двигатель представления:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new AreaAwareViewEngine());
}
... и регистр маршрут по умолчанию:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Area",
"",
new { area = "AreaZ", controller = "Default", action = "ActionY" }
);
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
}
Теперь Создают AreaController
, на который мы просто сослались:
public class DefaultController : Controller
{
public ActionResult ActionY()
{
return View("TestView");
}
}
Очевидно, что нам нужна структура каталога и ракурс, чтобы перейти с ним - мы будем держать этот супер простой:
<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<h2>TestView</h2>
This is a test view in AreaZ.
И все. Наконец, мы закончили .
По большей части, вы должны иметь возможность просто взять BaseAreaProViewEngine
и AreaProViewEngine
и поместить его в любой проект MVC, так что, несмотря на то, что для этого потребовалось много кода, нужно написать его только один раз. После этого необходимо отредактировать несколько строк в global.asax.cs
и создать структуру сайта.
Вам не обязательно посвящать целый спринт рефакторингу, он также может работать на уровне задач. Когда у вас есть история, которая требует работы с каким-то волосатым кусочком кода, включите задачу рефакторинга в эту историю как своего рода предпосылку для того, чтобы получить что-либо разумное сделано с этой частью. Тот путь, вы делаете прогресс с функциями, но также получить некоторые рефакторинг сделано постепенно.
-121--2655470-Я использовал нечто подобное, чтобы изменить существующую функцию, объявление которой было недоступно для меня:
// declare function foo
var foo = function (a) { alert(a); };
// modify function foo
foo = new Function (
"a",
foo.toSource()
.replace("alert(a)", "alert('function modified - ' + a)")
.replace(/^function[^{]+{/i,"") // remove everything up to and including the first curly bracket
.replace(/}[^}]*$/i, "") // remove last curly bracket and everything after<br>
);
Вместо toSource () можно использовать toString () , чтобы получить последовательность, содержащую объявление функции. Некоторые вызовы для замены () для подготовки последовательности к использованию конструктором функций и изменения источника функции.
-121--976343-routes.MapRoute(
"Area",
"{area}/",
new { area = "AreaZ", controller = "ControlerX ", action = "ActionY " }
);
Пробовали ли вы это?
Во-первых, какая версия MVC2 вы используете? Были существенные изменения от предварительного просмотра2 до RC.
Предполагая, что вы используете RC, я думаю, что маркировка-сопоставление должна выглядеть по-разному. В Araregistration.cs
в вашем районе вы можете зарегистрировать какой-то маршрут по умолчанию, например,
context.MapRoute(
"ShopArea_default",
"{controller}/{action}/{id}",
new { action = "Index", id = "", controller="MyRoute" }
);
Вышеуказанный код отправит пользователя MyRouteController
в нашем Shoparea
по умолчанию.
Использование пустой строки в качестве второго параметра должна выбрасывать исключение, поскольку должен быть указан контроллер.
Конечно, вам придется изменить маршрут по умолчанию в Global.Asax
, поэтому он не вмешивается в этот маршрут по умолчанию, например, Используя префикс для главного сайта.
Также см. В этом теме и ответа Haack: MVC 2 ARAREAREGISTRATIONAL ROUTURS USS
Надеюсь, это поможет.
Можно реализовать какую-то настройку, которую может получить код JNI. Например, в системе UNIX можно создать группы для специальных типов привилегий и проверить, имеет ли текущий пользователь требуемые привилегии, иначе просто вернуть 0 или что-то вроде того.
-121--3853818-Self plug: Я только что выпустил новый синтаксический анализатор HTML Java: jsoup . Я говорю об этом здесь, потому что я думаю, что это сделает то, за чем вы.
Для поиска элементов используется синтаксис селектора CSS, например,
String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
Elements links = doc.select("a");
Element head = doc.select("head").first();
Для получения дополнительной информации см. раздел Селектор javadoc.
Это новый проект, поэтому любые идеи по улучшению очень приветствуются!
-121--625526- Я думаю, вы хотите, чтобы пользователь был перенаправлен на ~/AreaZ
URL один раз, когда он посетил ~/
URL.
Я бы добился этого с помощью следующего кода в вашем корневом StartController
.
public class HomeController
{
public ActionResult Index()
{
return RedirectToAction("ActionY", "ControllerX", new { Area = "AreaZ" });
}
}
И следующий маршрут в Global.asax
.
routes.MapRoute(
"Redirection to AreaZ",
String.Empty,
new { controller = "Home ", action = "Index" }
);
Благодаря Аарону, чтобы указать, что это о раскрытии взглядов, я этого неправильно понял.
[Обновление] Я только что создал проект, который отправляет пользователю в область по умолчанию без вощения с любым из путей кода или поиска:
в Global.Asax, регистрируйте как обычно:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = ""} // Parameter defaults,
);
}
в Application_Start ()
, обязательно используйте следующий заказ;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
В вашей регистрации области используйте
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"ShopArea_default",
"{controller}/{action}/{id}",
new { action = "Index", id = "", controller = "MyRoute" },
new { controller = "MyRoute" }
);
}
Пример можно найти в http://www.emphess.net/2010/01/31/areas-routes-and-defaults-in-mvc--rc/
Я действительно надеюсь, что это то, что вы просили. ..
////
Я не думаю, что написание Pseudo ViewEdine
- лучшее решение в этом случае. (Не хватает репутации, я не могу комментировать). WebFormsViewEngine
знает область и содержит ProfertViewlocationFormats
, который определяется по умолчанию как
AreaViewLocationFormats = new[] {
"~/Areas/{2}/Views/{1}/{0}.aspx",
"~/Areas/{2}/Views/{1}/{0}.ascx",
"~/Areas/{2}/Views/Shared/{0}.aspx",
"~/Areas/{2}/Views/Shared/{0}.ascx",
};
Я считаю, что вы не придерживаетесь настоящей Конвенции. Вы разместили
public ActionResult ActionY()
{
return View("~/Areas/AreaZ/views/ActionY.aspx");
}
как работающий взлом, но это должно быть
return View("~/Areas/AreaZ/views/ControllerX/ActionY.aspx");
, если вы не хотите следовать Конвенции, однако вы можете захотеть сделать короткий путь, либо вытекающий из WebFormviewViewine
(Это делается в MVCContrib, например), где вы можете установить пути поиска в конструкторе, или немного хакери - уточняя свою конвенцию, как это на Application_Start
:
((VirtualPathProviderViewEngine)ViewEngines.Engines[0]).AreaViewLocationFormats = ...;
Это должно быть выполнено Немного большей уход, конечно, но я думаю, что это показывает идею. Эти поля
в
VirtualPathProvidervivieweongine
в MVC 2 RC.
Расположение различных строительных блоков осуществляется в жизненном цикле запроса. Один из первых шагов в жизненном цикле ASP.NET MVC составляет отображение запрошенного URL к правильному методу действия контроллера. Этот процесс упоминается как маршрутизация. Маршрут по умолчанию инициализируется в файле Global.Asax и описывает Framework Asp.net MVC, как обрабатывать запрос. Двойной щелчок на файле Global.Asax в проекте MVCapplication1 отобразится следующий код:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing;
namespace MvcApplication1 {
public class GlobalApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index",
id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
в обработчике события Application_Start (), который уволен всякий раз, когда приложение будет компинтировано, либо веб-сервер перезагружен, таблица маршрута зарегистрирована Отказ Маршрут по умолчанию называется по умолчанию и отвечает на URL в виде http://www.example.com/ {контроллер} / {action} / {id}. Переменные между {и} заполнены фактическими значениями из URL-адреса запроса или с значениями по умолчанию, если в URL присутствует переопределение. Этот маршрут по умолчанию будет отображаться до домашнего контроллера и метода действий индекса, в соответствии с параметрами маршрутизации по умолчанию. У нас не будет никаких других действий с этой картой маршрутизации.
По умолчанию все возможные URL могут быть отображены через этот маршрут по умолчанию. Также возможно создать наши собственные маршруты. Например, давайте сопоставьте URL http://www.example.com/employee/maarten к контроллеру сотрудника, действие Show, а также параметр firstName. Следующий фрагмент кода может быть вставлен в файл Global.Asax, который мы только что открыли. Поскольку Framework ASP.NET MVC использует первый соответствующий маршрут, этот фрагмент кода должен быть вставлен выше маршрута по умолчанию; В противном случае маршрут никогда не будет использоваться.
routes.MapRoute(
"EmployeeShow", // Route name
"Employee/{firstname}", // URL with parameters
new { // Parameter defaults
controller = "Employee",
action = "Show",
firstname = ""
}
);
Теперь давайте добавим необходимые компоненты для этого маршрута. Прежде всего, создайте класс по имени WorkeeController в папке контроллеров. Вы можете сделать это, добавив новый элемент в проект и выбрав шаблон класса контроллера MVC, расположенный под веб | Категория MVC. Удалите метод действий индекса и замените его методом или действием с именем Show. Этот метод принимает параметр первого знака и передает данные в словарь ViewData. Этот словарь будет использоваться с помощью представления для отображения данных.
Класс WARDEECONTROLLER пройдет объект сотрудника к представлению. Этот класс сотрудника должен быть добавлен в папке моделей (щелкните правой кнопкой мыши по этой папке, а затем выберите «Добавить | класс» из контекстного меню). Вот код для класса сотрудников:
namespace MvcApplication1.Models {
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
}
Вот как я это сделал. Я не знаю, почему MapRoute () не позволяет вам установить область, но он возвращает объект маршрута, поэтому вы можете продолжать вносить любые дополнительные изменения, которые захотите. Я использую это, потому что у меня есть модульный сайт MVC, который продается корпоративным клиентам, и они должны иметь возможность помещать библиотеки DLL в папку bin для добавления новых модулей. Я разрешаю им изменить "HomeArea" в конфигурации AppSettings.
var route = routes.MapRoute(
"Home_Default",
"",
new {controller = "Home", action = "index" },
new[] { "IPC.Web.Core.Controllers" }
);
route.DataTokens["area"] = area;
Редактировать: Вы также можете попробовать это в своей AreaRegistration.RegisterArea для той области, в которую пользователь должен переходить по умолчанию. Я не тестировал его, но AreaRegistrationContext.MapRoute устанавливает для вас route.DataTokens ["area"] = this.AreaName;
.
context.MapRoute(
"Home_Default",
"",
new {controller = "Home", action = "index" },
new[] { "IPC.Web.Core.Controllers" }
);
Добавление следующего в Application_Start работает для меня, хотя я не уверен, что у вас есть эта настройка в RC:
var engine = (WebFormViewEngine)ViewEngines.Engines.First();
// These additions allow me to route default requests for "/" to the home area
engine.ViewLocationFormats = new string[] {
"~/Views/{1}/{0}.aspx",
"~/Views/{1}/{0}.ascx",
"~/Areas/{1}/Views/{1}/{0}.aspx", // new
"~/Areas/{1}/Views/{1}/{0}.ascx", // new
"~/Areas/{1}/Views/{0}.aspx", // new
"~/Areas/{1}/Views/{0}.ascx", // new
"~/Views/{1}/{0}.ascx",
"~/Views/Shared/{0}.aspx",
"~/Views/Shared/{0}.ascx"
};