精华内容
下载资源
问答
  • urlpatterns 变量的语法1 包含其它的URLconfs1.1 项目目录结构如下注:记得在settings.py中配置新添加的应用;1.2 不同目录下的urls.py配置2 url别名反向解析 1 包含其它的URLconfs 在实际项目中,将所有应用的URL...

    1 包含其它的URLconfs

    在实际项目中,将所有应用的URL路径放置于一个 urls.py ,容易发生因为耦合程度高,造成后期自定义配置困难、维护成本高等问题。由此,Django 的 urls.py 配置文件可以 “include” 其它URLconf 模块,将一部分URL 放置于其它URL 下面。

    1.1 项目目录结构如下

    djangoProject

    注:记得在settings.py中配置新添加的应用;

    1.2 不同目录下的urls.py配置

    1. djangoProject\djangoProject\urls.py

      from django.conf.urls import url, include
      from django01 import views
      
      urlpatterns = [
          url(r'^$', views.home),
          url(r'django01/', include('django01.urls')),
          url(r'django02/', include('django02.urls')),
      ]
      
      
    2. djangoProject\django01(/02)\urls.py

      from django.conf.urls import url
      from django01(/02) import views
      
      urlpatterns = [
          url(r'^index/', views.index),
      ]
      
      
    3. 其他配置与之前一致。

    2 url别名反向解析

    # urls.py 下配置 url 别名 name
    
    urlpatterns = [
        url(r'^books/', views.books, name='books'),
        url(r'^booksadd/', views.books_add, name='books_add'),
        url(r'^booksedit/(\d)+', views.books_edit, name='books_edit'),
        url(r'^booksdelete/(\d)+', views.books_delete, name='books_delete'),
    ]
    
    # views.py: 利用别名配置反向解析
    	from django.urls import reverse
    
        # 编辑内容时,可能利用原始数据的内容,通过 url 定位所点击数据对象,再通过数据对象进行后序操作
        def books_edit(request, book_id):
        if request.method == 'GET':
            try:
                book_obj = Books.objects.get(id=book_id)
                print(reverse('books_edit')) #/booksedit/ 无参数
                print(reverse('books_edit',args=(2,))) #/booksedit/2/ 带参数
    
            except Exception:
                return HttpResponse('错误的修改!')
            return render(request, 'booksedit.html', {'book_obj': book_obj, 'book_id': book_id})
        else:
            status = True if (request.POST.get('status') == 'on') else False
            title = request.POST.get('title')
            price = request.POST.get('price')
            date = request.POST.get('date')
            publisher = request.POST.get('publisher')
    
            Books.objects.create(**{
                'status': status,
                'title': title,
                'price': price,
                'date': date,
                'publisher': publisher,
            })
        return redirect(reverse('books'))
    
    
    # book_edit.html: form 表单用于接收 url 中的参数。
        <form action="{% url 'books_edit' %}" method="post">		# 无参数
        <form action="{% url 'books_edit' book_id %}" method="post">  # 有参数
    
    

    3 url 命名空间

    3.1 命名解析冲突实验环境

    在 django 项目中创建两个应用 app01、app02 。

    1. 配置项目的 urls.py 如下:

       from django.contrib import admin
       from django.urls import path, include
      
       urlpatterns = [
           path('admin/', admin.site.urls),
           path('app01/', include('app01.urls')),
           path('app02/', include('app02.urls')),
       ]
      
    2. 在 app01、app02 文件下创建 urls.py 、views.py 分别配置如下:

      ************ app01/urls.py ************
      from app01 import views
      
      from django.urls import re_path
      
      urlpatterns = [
          re_path(r'index/', views.index, name='index'),
      ]
      
      ************ app01/views.py ************
      from django.shortcuts import reverse,HttpResponse
      
      # Create your views here.
      def index(request):
          print('app01: ', reverse('index'))
          return HttpResponse('app01 index')
      
      
      ************ app02/urls.py ************
      from app02 import views
      
      from django.urls import re_path
      
      urlpatterns = [
          re_path(r'index/', views.index, name='index'),
      ]
      
      ************ app02/views.py ************
      from django.shortcuts import reverse, HttpResponse
      
      
      # Create your views here.
      def index(request):
          print('app02: ', reverse('index'))
          return HttpResponse('app02 index')
      
    3. 通过浏览器分别访问 127.0.0.1:8000/app01/index127.0.0.1:8000/app02/index ,虽然前端显示正确,但查看后台输出:

      app01:  /app02/index/
      app02:  /app02/index/
      

      可以发现,app01 反向解析的 ‘index’/app02/index/命名解析发生冲突。

    3.2 解决方式:命名空间

    3.2.1 方式一

    在项目urls.py文件下,将 include() 所包含的模块中设置一个由 应用urlpattern应用名称 组成的二元组。

    1. 修改项目的 urls.py 如下:

       from django.contrib import admin
       from django.urls import path, include
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
          path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
      ]
      
    2. 在 app01、app02 文件下修改 views.py 配置如下:

      ************ app01/views.py ************
      from django.shortcuts import reverse,HttpResponse
      
      # Create your views here.
      def index(request):
          print('app01: ', reverse('app01:index'))
          return HttpResponse('app01 index')
      
      
      ************ app02/views.py ************
      from django.shortcuts import reverse, HttpResponse
      
      
      # Create your views here.
      def index(request):
          print('app02: ', reverse('app02:index'))
          return HttpResponse('app02 index')
      
    3. 通过浏览器分别访问 127.0.0.1:8000/app01/index127.0.0.1:8000/app02/index ,前端显示正确,查看后台输出正常解析:

      app01:  /app01/index/
      app02:  /app02/index/
      

    3.2.2 方式二

    在 include 模块中,指定 app_name 。

    1. 在 app01、app02 文件下修改 urls.py 分别配置如下:

      ************ app01/urls.py ************
      from app01 import views
      
      from django.urls import re_path
      # 添加 app_name。
      app_name = 'app01'
      urlpatterns = [
          re_path(r'index/', views.index, name='index'),
      ]
      
      ************ app01/views.py ************
      from django.shortcuts import reverse,HttpResponse
      
      # Create your views here.
      def index(request):
          print('app01: ', reverse('app01:index'))
          return HttpResponse('app01 index')
      
      
      
      ************ app02/urls.py ************
      from app02 import views
      
      from django.urls import re_path
      # 添加 app_name 。
      app_name = 'app02'
      urlpatterns = [
          re_path(r'index/', views.index, name='index'),
      ]
      
      ************ app02/views.py ************
      from django.shortcuts import reverse, HttpResponse
      
      
      # Create your views here.
      def index(request):
          print('app02: ', reverse('app02:index'))
          return HttpResponse('app02 index')
      
    2. 通过浏览器分别访问 127.0.0.1:8000/app01/index127.0.0.1:8000/app02/index ,前端显示正确,查看后台输出正常解析:

      app01:  /app01/index/
      app02:  /app02/index/
      
    展开全文
  • @WebFilter和@Component一起使用导致urlPatterns不起作用@WebFilter和@Component@WebFilter@Component @WebFilter和@Component 本文你主要讲解@WebFilter注解和@Component以及在使用过程中遇到的坑 @WebFilter 1....

    @WebFilter和@Component一起使用导致urlPatterns不起作用

    @WebFilter和@Component

    本文你主要讲解@WebFilter注解和@Component以及在使用过程中遇到的坑

    @WebFilter

    1.基本概念:
    @WebFilter用于将一个类声明为过滤器,该注解将会在部署时候被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的常用属性(以下所有属性均为可选属性,但是value、urlPatterns、servletNames三者必须至少包含一个,且value和urlPatterns不能共存,如果同同时制定,通常忽略value的值)

    属性名类型描述
    filterNameString指定过滤器的name属性,等价于< filter-name>
    valueString[]该属性等价于urlPatterns属性,但是两个不应该同时使用
    urlPatternsString[]指定一组过滤器的URL匹配模式。等价于< url-pattern>
    sevletNamesString[]指定过滤器将用于哪些servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中< servlet-name>
    dispatcherTypesDispatcheType指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST
    initParamsWebInitParam[]指定一组过滤器初始化参数,等价于< init-param>
    asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于< async-supported>标签
    descriptionString该过滤器的描述信息,等价于< description>
    displayNameString该过滤器的显示名,通常配合工具使用,等价于< display-name>

    2.正确示例:
    a.过滤器如下

    @WebFilter(filterName = "useTokenRequestFilter", urlPatterns = {"/v1/quote/*"})
    public class MyFilter implements Filter{
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
            //TODO
            chain.doFilter(req, resp);
        }
    
        @Override
        public void destroy() {
        }
    }
    

    b.在启动类添加@ServletComponentScan

    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    @EnableAspectJAutoProxy
    @EnableDiscoveryClient
    @ServletComponentScan(basePackages = {"填写自己的过滤器包名"})
    @EnableFeignClients
    @EnableCaching
    public class123Application {
        public static void main(String[] args) {
            System.setProperty("com.alibaba.nacos.client.naming.tls.enable","true");
            SpringApplication.run(OrderServiceApplication.class);
        }
    }
    

    @Component

    @component: 标注一个类为Spring容器的Bean,(把普通pojo实例化到spring容器中,相当于配置文件中的)

    采坑记录

    由于业务需要使用Filter。大体逻辑如下:
    ①通过WebFilter进行Filter声明,这样容器在进行部署的时候就会处理该Filter,创建实例并创建配置对象FilterConfig,然后会将该Filter应用到urlPatterns所指定的url;
    ②在init方法中获取到初始化参数,自定义的excludedUrls,作为成员在后续执行过滤逻辑的时候使用;
    ③在doFilter中进行url的鉴定,如果需要执行认证鉴权处理,则执行相应逻辑。不满足条件的情况下重定向到登录页;
    ④Filter类增加Component注解,让该Filter被容器管理。
    问题就出在第一步和第四步。urlPatterns指定的URL不起作用,所有的请求都会经过过滤器,

    @Component
    @WebFilter(filterName = "1212121", urlPatterns = {"/v1/9874/*"})
    public class MyFilter implements Filter{
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
            //TODO
            chain.doFilter(req, resp);
        }
    
        @Override
        public void destroy() {
        }
    }
    

    然后在SpringBoot的Application中增加注解@ServletComponentScan,这样容器会扫描到@Component注解的Filter。

    问题出现

    出现的问题是:访问的url为/user/*或者/product/*的时候,该过滤器也执行了!
    也就是说,WebFilter注解配置的urlPatterns没有起作用。

    问题定位:
    在查看容器启动日志的时候,发现WebAuthFilter被两次注册,两次映射,分别为WebAuthFilter和webAuthFilter

    问题原因:
    WebAuthFilter的第一次映射容易理解,是我们自己通过@WebFilter定义的。那么webAuthFilter是谁给映射的呢?必然是Spring容器处理的。在跟踪源码的时候找到AbstractFilterRegistrationBean抽象类,该类中有一个方法onStartup,应该是容器启动的时候执行的,做的是一些Bean注册的工作。该方法最后调用了configure,在该方法中进行了映射处理。

    if (servletNames.isEmpty() && this.urlPatterns.isEmpty()) {
    	this.logger.info("Mapping filter: '" + registration.getName() + "' to: "
    		+ Arrays.asList(DEFAULT_URL_MAPPINGS));
         registration.addMappingForUrlPatterns(dispatcherTypes, this.matchAfter,
                        DEFAULT_URL_MAPPINGS);
    }else {
           if (!servletNames.isEmpty()) {
                    this.logger.info("Mapping filter: '" + registration.getName()
                            + "' to servlets: " + servletNames);
                    registration.addMappingForServletNames(dispatcherTypes, this.matchAfter,
                            servletNames.toArray(new String[servletNames.size()]));
                }
                if (!this.urlPatterns.isEmpty()) {
                    this.logger.info("Mapping filter: '" + registration.getName()
                            + "' to urls: " + this.urlPatterns);
                    registration.addMappingForUrlPatterns(dispatcherTypes, this.matchAfter,
                            this.urlPatterns.toArray(new String[this.urlPatterns.size()]));
                }
            }
    

    在servletNames和urlPatterns为空的情况下,进行了缺省映射,即映射到“/*”。置于servletNames和urlPatterns为空的情况,这里没有深究了。那么,为什么会出现定义的WebAuthFilter被两次注册的情况呢?仔细分析了一下,认为可能的原因是:@Component和@WebFilter双重注册导致的。
    解决方法:
    解决办法一@WebFilter
    在这种情况下,去掉了@Component注解,再次启动服务。查看日志,发现该Filter仅被映射一次,通过浏览器访问相应的url也表现正确。

    解决办法二@Component

    这种情况下,保留了@Component注解,那么要进行配置的urlPatterns怎么处理呢?
    通过FilterRegistrationBean进行@Bean声明,查看源码知道,onStartup进行注册的时候,实际上也是找到了各类RegistrationBean然后分别注册,配置映射。
    有各种类型的RegistrationBean:
    ①AbstractFilterRegistrationBean;
    ②FilterRegistrationBean;
    ③ServletListenerRegistrationBean;
    ④ServletRegistrationBean;
    那么我们自然可以通过自声明一个FilterRegistrationBean来进行注册。这种处理方式如下:
    去掉FIlter上的@WebFilter注解,增加如下的Configuration类:

    @Configuration
    public class WebAuthFilterConfig {
    
        @Bean
        public FilterRegistrationBean webAuthFilterRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean();
            registration.setFilter(webAuthFilter());
            registration.setName("WebAuthFilter");
            registration.addUrlPatterns("/web/*");
            registration.addInitParameter("excludeUrls", "/web/login");
            registration.setOrder(0);
            return registration;
        }
    
        @Bean
        public Filter webAuthFilter() {
            return new WebAuthFilter();
        }
    }
    

    如此处理,也能达到同样的效果。
    经过对比,当然第一种解决方案更直白,更简洁。
    参考链接:https://www.cnblogs.com/muxi0407/p/11950627.html

    展开全文
  • 在项目中针对某个接口请求进行特殊处理,通过过滤器的方式进行开发,当部署后发现一些本不该过滤的请求过滤了,但是urlPatterns中未添加相关url。 @Slf4j @Component @WebFilter(urlPatterns = { OpenConstant.OPEN...

    问题描述:

    在项目中针对某个接口请求进行特殊处理,通过过滤器的方式进行开发,当部署后发现一些本不该过滤的请求过滤了,但是urlPatterns中未添加相关url。

    @Slf4j
    @Component
    @WebFilter(urlPatterns = {
            OpenConstant.OPEN_PATH + "/alarm_report/*"
    })
    

    解决方案:

    去掉@Component注解 在启动类中增加@ServletComponentScan

    参考文章:

    https://blog.csdn.net/weixin_42822484/article/details/107270672

    展开全文
  • 2017-04-20 最新spring-boot增加Filter方法 首先定义一个Filter @Order(1) //重点 @WebFilter(filterName = "testFilter1", urlPatterns = "/*") public class TestFilterFirst implements Filter { @Override ...

    前言

    以往的javaEE增加Filter是在web.xml中配置,然而spring-boot中很明显不能这样实现,那怎么办呢?看完下面的教程,答案自然知道了。

    前言

    传统的javaEE增加Filter是在web.xml中配置,如以下代码:

    TestFiltercom.cppba.filter.TestFilterTestFilter/*paramNameparamValue

    然而spring-boot中很明显不能这样实现,那怎么办呢?看完下面的教程,答案自然知道了。

    老方法(新方法请直接下拉)

    1.创建自定义Filter

    package com.cppba.filter;

    import javax.servlet.*;

    import java.io.IOException;

    public class TestFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("TestFilter"); } @Override public void destroy() { } }

    2.在ApplicationConfiguration.java中增加一个@bean

    @Bean

    public FilterRegistrationBean testFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new TestFilter()); registration.addUrlPatterns("/*"); registration.addInitParameter("paramName", "paramValue"); registration.setName("testFilter"); registration.setOrder(1); return registration; }

    3.启动项目

    你会看到控制台打印如下代码:

    3424635

    https://github.com/bigbeef/cppba-spring-boot

    4.访问项目

    最后我们访问以下http://127.0.0.1:8080/test

    如果你看到控制台打印出:TestFilter

    3424635

    https://github.com/bigbeef/cppba-spring-boot

    恭喜你,配置成功!

    2017-04-20 最新spring-boot增加Filter方法

    首先定义一个Filter

    @Order(1)

    //重点

    @WebFilter(filterName = "testFilter1", urlPatterns = "/*") public class TestFilterFirst implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("TestFilter1"); filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { } }

    比较核心的代码是自定义类上面加上@WebFilter,其中@Order注解表示执行过滤顺序,值越小,越先执行

    我们在spring-boot的入口处加上如下注解@ServletComponentScan:

    @SpringBootApplication(scanBasePackages = "com.cppba")

    //重点

    @ServletComponentScan

    public class Application { public static void main(String[] args) throws UnknownHostException { SpringApplication app = new SpringApplication(Application.class); Environment environment = app.run(args).getEnvironment(); } }

    这种方法效果和上面版本一样,但是用起来更加方便!

    展开全文
  • 在创建django的过程中,写urlpatterns路径时,path下用正则表达式一直报错,且无法提取 解决: 在path()前加re_,变成re_path() 在python3中如果在路径中要使用正则表达式,那必须使用re_path路径来定义,path行不通 ...
  • 这里的表单 数据会提交到 urlPatterns = {"/addUser"}
  • urlPatterns映射的规则

    2021-03-25 15:38:23
    说明:本文的urlPatterns均在Servlet项目的注解中设置 精确匹配 访问的url和urlPatterns保持一致 例如:urlPatterns = “/test”,请求的url为http://localhost:8080/webpro/test 路径匹配 例如:urlPatterns = ...
  • 场景描述 彼时在项目中写了两个filter,都是使用extend Filter...出现的场景:urlPatterns的路径限制失效 解决思路 既然路径失效了,那么肯定是路径被覆盖掉了吧,大的路径把小的路径覆盖掉 --> 那么是不是一个属性
  • 一、URL路由配置的用途   URL是Django收到用户请求后,根据用户请求的URL地址...urlpatterns = [ path('index', views.index), ] # index这个路由对应着视图函数中index这个方法,浏览器输入这个链接,就会响应到ind
  • 1.简单的路由配置 ...urlpatterns = [ re_path(r'^articles/2003/$', views.special_case_2003), re_path(r'^articles/([0-9]{4})/$', views.year_archive), re_path(r'^articles/([0-9]{4})/([0-9]{2})/$',
  • @WebServlet(urlPatterns = {"/UrlsServlet/**"})->这种路径写法是错误的 @WebServlet(urlPatterns = {"/UrlsServlet"})->精确匹配,只匹配/UrlsServlet @WebServlet(urlPatterns = {"*.do"})->拓展名匹配,匹配后缀...
  • return HttpResponse("hello world") 配置路由 mydemo-->urls.py from django.contrib import admin from django.urls import path from myapp import views urlpatterns = [ #path('admin/', admin.site.urls), ...
  • 在 mysite/urls.py 文件的 urlpatterns 列表里插入一个 include(), 如下: mysite/urls.py from django.contrib import admin from django.urls import include, path urlpatterns = [ path('polls/', include('...
  • Format suffixes格式后缀 1.format_suffix_patterns format_suffix_patterns(urlpatterns, suffix_required=False, allowed=None) # 返回 URL 模式列表 # 其中包括附加到所提供的每个 URL 模式的格式后缀模式 # ...
  • 一、@WebServlet 注解属性说明@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interfaceWebServlet {String name()default "";...String[] urlPatterns()defaul...
  • import views # namespace app_name = 'blog' urlpatterns = [ # 展示所有文章 path('/index/', views.ArticleListView.as_view(), name='article_list'), # 展示文章详情 re_path(r'^article/(?P\d+)/(?P[-\w]+)/$...
  • (1.4) urls.py: from django.conf.urls import patterns, include, url from django.conf import settings from django.contrib.staticfiles.urls import staticfiles_urlpatterns import views urlpatterns = ...
  • from channels.routing import ProtocolTypeRouter, URLRouter # from apps.websocket_app.urls import websocket_urlpatterns from websocket_demo.urls import websocket_urlpatterns os.environ.setdefault('...
  • JavaWeb —— Servlet介绍

    2021-01-17 00:02:25
    //代表urlPatterns()属性配置 String[] urlPatterns() default {};//相当于 int loadOnStartup() default -1;//相当于 WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String ...
  • @WebFilter(filterName = "LoginSerlvet",urlPatterns = "/login1.jsp") public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @...
  • } } 5.2 LoginServlet的实现 web包下创建相应的servlet,配置请求路径 @WebServlet(urlPatterns = "/login") servlet的流程: •接受参数 •调取service层的方法,service又在调取dao层的方法 •根据结果跳转页面 ...
  • @WebFilter(urlPatterns = { "/table/*","/user/*", "/contact/*","/run/*","/conf/*"}) public class SessionTimeoutRedirect implements Filter { protected final Logger logger = LoggerFactory.getLogger(...
  • include from django.contrib import admin from django.conf import settings import os from django.conf import settings from django.conf.urls.static import static urlpatterns = [ url(r'^gallery/', ...
  • 一:简单介绍java Servlet 类: javaServlet 的核心思想是web服务器端创建用来响应客户端请求的对象,该对象被称为一个server对象。jsp技术以javaserver 为基础,当客户端请求一个jsp页面时,Web服务器会自动生成一...
  • url使用方法(开发工程师应该都知道): from django.conf.urls import url, include urlpatterns = [ url(r'^admin/', admin.site.urls)] 现在跟着源码django.conf.urls 下去寻找url文件 看到在urls下只有i18n.py ...
  • '/'), ) urls.py urlpatterns = [ url(r'^$', include('home.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^artist/', include('artists.urls')), url(r'photo/', include('photo.urls')) ] ...
  • P\w+|(\w+\+\w+)+)/',views.movie_list), ] (3)在“chapter3\chapter3\urls.py”添加URL配置 # chapter3\chapter3\urls.py from django.urls import path,include urlpatterns = [ path('movie/',include('movie....
  • 则需要urlPatterns来匹配url 自定义认证Filter /** * 权限认证问题处理 */ @Order(1) @WebFilter(filterName = "authFilter", urlPatterns = "/api/**") public class AuthFilter implements Filter { private ...
  • urlpatterns = [ path('',include('**.urls',namespace='子应用名')) ] 结果报出如下错误: django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,558
精华内容 24,223
关键字:

urlpatterns