2012-01-12 9 views
19

मैं नए webapp2 (1.6 में अब डिफ़ॉल्ट वेबएप्लिकेशन) का उपयोग कर रहा है, और मैं यह पता लगाने की अनुगामी इस तरह कोड में वैकल्पिक स्लेश बनाने के लिए कैसे करने के लिए नहीं कर पाए हैं:मैं webapp2 के साथ एक पिछला स्लैश वैकल्पिक कैसे बना सकता हूं?

webapp.Route('/feed', handler = feed) 

मैंने /feed/?, /feed/*, /feed\/* और /feed\/? का प्रयास किया, सभी का कोई फायदा नहीं हुआ।

उत्तर

13

डुप्लिकेट URL बनाने से बचने के लिए:: आप जो नियमित अभिव्यक्ति टेम्प्लेट उपलब्ध कराता है पुरानी शैली नियमों का उपयोग कर सकते हैं एक ही पृष्ठ पर है, आप स्वचालित रूप से पुनर्निर्देशित करने के लिए/फ़ीड/to/फ़ीड सही पर सेट strict_slash के साथ एक RedirectRoute का उपयोग करना चाहिए , इस तरह:

from webapp2_extras.routes import RedirectRoute 

route = RedirectRoute('/feed', handler=feed, strict_slash=True) 

पढ़ें, क्योंकि यह एक अनावश्यक HTTP पुन: निर्देशित का कारण बनता है और अधिक पर http://webapp2.readthedocs.io/en/latest/api/webapp2_extras/routes.html

+1

धन्यवाद। क्या आप कहने का मतलब है कि अगर मेरे पास सौ मार्ग हैं, तो मुझे सौ रीडायरेक्टआउट भी चाहिए? एक बहुत गन्दा समाधान लगता है। –

+1

हाय। नहीं, आप रूट्स को रीडायरेक्ट रूट्स से प्रतिस्थापित करते हैं, इसलिए आपको दोनों की आवश्यकता नहीं है। RedirectRoute वह रूट करता है जो रूट करता है, लेकिन "सख्त_स्लैश" विकल्प, साथ ही साथ कुछ अन्य रीडायरेक्ट कार्यक्षमता भी जोड़ता है। विवरण के लिए ऊपर दिए गए लिंक को देखें। – Aneon

+0

यह हमेशा एक अच्छा विचार नहीं है। यदि आपका ग्राहक वेब ब्राउज़र नहीं है (उदाहरण के लिए, यदि आप अपनी वेबसाइट के लिए http-accessable api लिख रहे हैं), तो यह रीडायरेक्ट का पालन नहीं कर सकता है। – Ponkadoodle

-4

मैं webapp2 से परिचित नहीं हूँ, लेकिन अगर पहले पैरामीटर एक रेगुलर एक्सप्रेशन है, कोशिश:

/feed(/)? 
2

webapp2.Route टेम्पलेट एक नियमित अभिव्यक्ति नहीं है और अपने मूल्य re.escape के साथ भाग जा रहा है।

webapp2.SimpleRoute('^/feed/?$', handler = feed) 
+0

मैं नियमित रूप से नियमित अभिव्यक्ति के लिए नीचे गिर के बिना webapps 'खुद सिंटैक्स का उपयोग जारी रखना चाहते हैं। .. उस अर्थ में 'सख्त_स्लैश' मुझे वही देता है जो मैं चाहता हूं कि कम से कम कोड बदल जाए। –

7

मैं RedirectRoute वर्ग पसंद नहीं है।
webapp2 Route class के लिए प्रलेखन के आधार पर, इस webapp2.Route with optional leading part धागे में एक और विस्तृत उत्तर दिया गया है।

लघु उत्तर

मेरे मार्ग पैटर्न निम्न URL के लिए काम करता है।

  1. /
  2. /फ़ीड
  3. /फ़ीड/
  4. /फ़ीड/बनाने
  5. /फ़ीड/बनाएँ/
  6. /फ़ीड/संपादित करें/{ENTITY_ID}
SITE_URLS = [ 
    webapp2.Route(r'/', handler=HomePageHandler, name='route-home'), 

    webapp2.Route(r'/feed/<:(create/?)|edit/><entity_id:(\d*)>', 
     handler=MyFeedHandler, 
     name='route-entity-create-or-edit'), 

    webapp2.SimpleRoute(r'/feed/?', 
     handler=MyFeedListHandler, 
     name='route-entity-list'), 
] 

उम्मीद है कि यह मदद करता है :-)

4

यहां बताया गया है कि मैं इन मार्गों को कैसे संभालता हूं।

from webapp2 import Route 
from webapp2_extras.routes import PathPrefixRoute 
import handlers 

urls = [ 
    Route('/foo<:/?>', handlers.Foo), 
    Route('/bars', handlers.BarList), 
    PathPrefixRoute('/bar', [ 
    Route('/', handlers.BarList), 
    Route('/<bar_id:\w+><:/?>', handlers.Bar), 
    ]), 
] 
... 

यह ध्यान रखें कि आपके संचालकों *args और **kwargs परिभाषित करने के लिए संभावित स्लैश है, जो एक बहस इस पद्धति का उपयोग के रूप में उन्हें भेजा जाता है के साथ सौदा करने की आवश्यकता होगी महत्वपूर्ण है।

class Bar(webapp2.RequestHandler): 

    def get(bar_id, *args, **kwargs): 
    # Lookup and render this Bar using bar_id. 
    ... 
1

मैं PathPrefixRoute ब्लॉक वैकल्पिक की रूट पर ट्रेलिंग स्लैश बनाने का एक तरीका ढूंढ रहा था।

यदि आप हैं, कहते हैं:

from webapp2_extras.routes import RedirectRoute, PathPrefixRoute 

from webapp2 import Route 

app = webapp2.WSGIApplication([ 
    PathPrefixRoute('admin', [ 
     RedirectRoute('/', handler='DashboardHandler', name='admin-dashboard', strict_slash=True), 
     RedirectRoute('/sample-page/', handler='SamplePageHandler', name='sample-page', strict_slash=True), 
    ]), 
]) 

आप /admin/ उपयोग करने में सक्षम हो जाएगा, लेकिन नहीं /admin

from webapp2_extras.routes import RedirectRoute, PathPrefixRoute 

from webapp2 import Route 

app = webapp2.WSGIApplication([ 
    Route('admin', handler='DashboardHandler', name='admin-dashboard'), 
    PathPrefixRoute('admin', [ 
     RedirectRoute('/', redirect_to_name='admin-dashboard'), 
     RedirectRoute('/sample-page/', handler='SamplePageHandler', name='sample-page', strict_slash=True), 
    ]), 
]) 

मैं इस समस्या का बेहतर समाधान में दिलचस्पी रखता हूँ:

जब से मैं किसी भी बेहतर समाधान नहीं मिल सकता है, मैं की तरह एक अतिरिक्त मार्ग के लिए एक redirect_to_name जोड़ दिया है,।

क्या मुझे स्टुन के समाधान के लिए जाना चाहिए और केवल RedirectRoute का उपयोग नहीं करना चाहिए?

+0

आप मेरे समाधान का प्रयास कर सकते हैं: http://stackoverflow.com/a/22223617/1175629 –

1

यह मेरे लिए काम करता है और यह बहुत आसान है। यह Webapp2 रूट class में यूआरआई रूटिंग के लिए टेम्पलेट प्रारूप का उपयोग करता है। इस उदाहरण में स्लैश पीछे चल रीडायरेक्ट के साथ वैकल्पिक है: <:regex>

+0

आपके तरीकों को ध्यान देने योग्य मूल्य अतिरिक्त तर्क की आवश्यकता है, जो थोड़े से बेकार है। – alex

+0

मैं अपने तरीकों में '* args, ** kwargs 'पास करता हूं, इसलिए' पेजहैंडलर 'के लिए' get' 'को' def 'प्राप्त होगा (स्वयं, * args, ** kwargs)' – HorseloverFat

0

मैं hacky तरह से एक तरह से के साथ आया था:

webapp2.Route('/your_url<:/?>', PageHandler) 

सब कुछ के बाद शेवरॉन के बीच पेट के एक regex माना जाता है। मैं निम्नलिखित वर्ग को परिभाषित:

class UrlConf(object): 

    def __init__(self, *args, **kwargs): 
     self.confs = [] 
     for arg in args: 
      if isinstance(arg, webapp2.Route): 
       slash_route = webapp2.Route(arg.template + '/', arg.handler) 
       self.confs += [arg, slash_route] 

    def __iter__(self): 
     for route in self.confs: 
      yield route 

तो मैं तरह मेरे रूट सेट निम्नलिखित:

MIRROR_URLS = list(UrlConf(
    Route('/path/to/stuff', handler=StuffHandler, name='stuff.page'), 
    Route('/path/to/more/stuff', handler= MoreStuffHandler, name='more.stuff.page') 
)) 

आप इस मार्ग से जाने के लिए चयन करते हैं, तो आप स्पष्ट रूप से सुधार कर सकते हैं पर इसके साथ अधिक लचीला होना बेसराउट ऑब्जेक्ट्स के अन्य प्रकार।

1

आप (और आप शायद नहीं है) रीडायरेक्ट का उपयोग नहीं करना चाहते हैं, तो आप Route.match() ओवरराइड कर सकते हैं:

from webapp2 import Route, _get_route_variables 
import urllib 
from webob import exc 


class SloppyRoute(Route): 
    """ 
    A route with optional trailing slash. 
    """ 
    def __init__(self, *args, **kwargs): 
     super(SloppyRoute, self).__init__(*args, **kwargs) 

    def match(self, request): 
     path = urllib.unquote(request.path) 
     match = self.regex.match(path) 
     try: 
      if not match and not path.endswith('/'): 
       match = self.regex.match(path + '/') 
     except: 
      pass 
     if not match or self.schemes and request.scheme not in self.schemes: 
      return None 

     if self.methods and request.method not in self.methods: 
      # This will be caught by the router, so routes with different 
      # methods can be tried. 
      raise exc.HTTPMethodNotAllowed() 

     args, kwargs = _get_route_variables(match, self.defaults.copy()) 
     return self, args, kwargs 
संबंधित मुद्दे