Пользовательский PageHandlerFactory для .aspx

Вы можете объединить Series в DataFrame и затем использовать .agg. NaN будет вставлено, чтобы заполнить ячейки с неравной длиной, но большинство функций pandas agg будут игнорировать их по умолчанию для расчетов.

import pandas as pd
df = pd.concat([pd.Series(x) for x in [X_1, X_2]], axis=1, keys=['X_1', 'X_2'])

df.agg(['mean', 'std']).T
#     mean       std
#X_1   2.0  1.000000
#X_2   6.0  1.581139

Если у вас много списков, возможно, лучше хранить их в словаре, чтобы избежать записи ключей и списков по отдельности

5
задан Josh Stodola 8 January 2009 в 19:18
поделиться

2 ответа

Когда я записал простой CMS, мне было тяжело использовать PageHandlerFactory, чтобы заставить его делать то, что я хотел. В конце я переключился на IHttpModule.

Мой модуль сначала проверил бы, чтобы видеть, был ли .aspx файл в запрашиваемом тракте. Я только сделал бы это, если страница имеет пользовательские элементы управления на нем или не вписывалась в CMS по некоторым причинам. Таким образом, если бы файл существовал, то он возвратился бы из модуля. После этого это посмотрело бы на запрашиваемый тракт и уплотнило бы его в "тег навигации". Таким образом ~/aboutus/default.aspx стал бы page.aspx? nt=aboutusdefault. page.aspx загрузил бы надлежащую форму содержания CMS. Конечно, перенаправление происходит серверная сторона, таким образом, пользователи/пауки никогда не знают, что что-либо различное произошло.

using System;
using System.Data;
using System.Collections.Generic;
using System.Configuration;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Web;

namespace MyCMS.Handlers {
    /// <summary>
    /// Checks to see if we should display a virutal page to replace the current request.
    /// Code adapted from:
    /// Rewrite.NET -- A URL Rewriting Engine for .NET
    /// By Robert Chartier
    /// http://www.15seconds.com/issue/030522.htm
    /// </summary>
    public class VirtualPageModule : IHttpModule {
        /// <summary>
        /// Init is required from the IHttpModule interface
        /// </summary>
        /// <param name="Appl"></param>
        public void Init(System.Web.HttpApplication Appl) {
            // make sure to wire up to BeginRequest
            Appl.BeginRequest += new System.EventHandler(Rewrite_BeginRequest);
        }

        /// <summary>
        /// Dispose is required from the IHttpModule interface
        /// </summary>
        public void Dispose() {
            // make sure you clean up after yourself
        }

        /// <summary>
        /// To handle the starting of the incoming request
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
            // Cast the sender to an HttpApplication object
            HttpApplication httpApp = (HttpApplication)sender;

            // See if the requested file already exists
            if (System.IO.File.Exists(httpApp.Request.PhysicalPath)) {
                // Do nothing, process the request as usual
                return;
            }

            string requestPath = VirtualPathUtility.ToAppRelative(httpApp.Request.Path);

            // Organic navigation tag (~/aboutus/default.aspx = nt "aboutusdefault")
            Regex regex = new Regex("[~/\\!@#$%^&*()+=-]");
            requestPath = regex.Replace(requestPath, string.Empty).Replace(".aspx", string.Empty);
            string pageName = "~/page.aspx";
            string destinationUrl = VirtualPathUtility.ToAbsolute(pageName) + "?nt=" + requestPath;
            SendToNewUrl(destinationUrl, httpApp);
        }

        public void SendToNewUrl(string url, HttpApplication httpApp) {
            applyTrailingSlashHack(httpApp);
            httpApp.Context.RewritePath(
                url,
                false // RebaseClientPath must be false for ~/ to continue working in subdirectories.
            );
        }

        /// <summary>
        /// Applies the trailing slash hack. To circumvent an ASP.NET bug related to dynamically
        /// generated virtual directories ending in a trailing slash (/).
        /// As described by BuddyDvd:
        /// http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105061
        /// </summary>
        /// <param name="httpApp">The HttpApplication.</param>
        /// <remarks>
        /// Execute this function before calling RewritePath.
        /// </remarks>
        private void applyTrailingSlashHack(HttpApplication httpApp) {
            if (httpApp.Request.Url.AbsoluteUri.EndsWith("/") && !httpApp.Request.Url.AbsolutePath.Equals("/")) {
                Type requestType = httpApp.Context.Request.GetType();
                object clientFilePath = requestType.InvokeMember("ClientFilePath", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty, null, httpApp.Context.Request, null);
                string virtualPathString = (string)clientFilePath.GetType().InvokeMember("_virtualPath", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField, null, clientFilePath, null);
                clientFilePath.GetType().InvokeMember("_virtualPath", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.SetField, null, clientFilePath, new object[] { virtualPathString });
                requestType.InvokeMember("_clientFilePath", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.SetField, null, HttpContext.Current.Request, new object[] { clientFilePath });
                object clientBaseDir = requestType.InvokeMember("ClientBaseDir", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty, null, httpApp.Context.Request, null);
                clientBaseDir.GetType().InvokeMember("_virtualPath", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.SetField, null, clientBaseDir, new object[] { virtualPathString });
                requestType.InvokeMember("_clientBaseDir", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.SetField, null, HttpContext.Current.Request, new object[] { clientBaseDir });
            }
        }
    }
}
3
ответ дан 15 December 2019 в 06:37
поделиться

Вы подразумеваете, что собираетесь ввести средства управления? Если это так, Вы могли бы хотеть рассмотреть необходимый базовый класс вместо класса Page. Page реализует IHttpHandler, таким образом, можно создать производный класс и затем изменить страницы для получения из производного класса. Вы будете иметь намного больше контроля своей страницей и мочь сцепиться в него и ее рендеринг.

0
ответ дан 15 December 2019 в 06:37
поделиться
Другие вопросы по тегам:

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