AssertionError: Функционалды көрсетуді қарау ағымдағы соңғы нүктенің функциясын қайта жазады: басты

Егер менде екі рет URL ережесі бар болса, неге соңғы нүкте функциясын қайта жазу мүмкін болмайтынын біреу біледі

app.add_url_rule('/',
                 view_func=Main.as_view('main'),
                 methods=["GET"])

app.add_url_rule('//',
                 view_func=Main.as_view('main'),
                 methods=["GET"])

Аңду:

Traceback (most recent call last): 
  File "demo.py", line 20, in  methods=["GET"]) 
  File ".../python2.6/site-packages/flask‌​/app.py", 
    line 62, in wrapper_func return f(self, *args, **kwargs) 
  File ".../python2.6/site-packages/flask‌​/app.py", 
    line 984, in add_url_rule 'existing endpoint function: %s' % endpoint)  
AssertionError: View function mapping is overwriting an existing endpoint 
    function: main
32
Сіз не істей алатыныңызды немесе неге сізден сұрайсыз?
қосылды автор Michael Davis, көзі
Не істемейді? Сіз қандай қателерді байқайсыз?
қосылды автор Michael Davis, көзі
Шекара - бұл салқын сөз
қосылды автор Dagrooms, көзі
Егер біреу Flask-тегі бірегей көзқарастың бұл шекарасы бар екенін білгісі келсе, мына сұраққа жауапты көре аламын: stackoverflow.com/a/47558985/4440675 Бұл жауап әрбір әдіске арналған бірегей атау болатын логиканың қайсысы артта қалатынын түсіндіреді.
қосылды автор Amit Tripathi, көзі
неге бұл жұмыс істемейді, мен оқулықты оқып жүрмін
қосылды автор Kimmy, көзі

7 жауаптар

Бірдей көрініс әдісіне нұсқайтын болса да, көрініс атауларыңыз ерекше болуы керек.

app.add_url_rule('/',
                 view_func=Main.as_view('main'),
                 methods = ['GET'])

app.add_url_rule('//',
                 view_func=Main.as_view('page'),
                 methods = ['GET'])
34
қосылды

Бұл мәселе менімен, бірақ басқа пайдалануда. API функциясын 2 декоратормен орауға тырыстым:

  1. @ app.route()
  2. Менің костюм @exception_handler декораторы

Мен осындай ерекше жағдайды алдым, себебі екі декоратормен бір функциядан артық орауға тырыстым:

@app.route("/path1")
@exception_handler
def func1():
    pass

@app.route("/path2")
@exception_handler
def func2():
    pass

Атап айтқанда, бұл қаптама атымен бірнеше функцияларды тіркеуге тырысады:

def exception_handler(func):
  def wrapper(*args, **kwargs):
    try:
        return func(*args, **kwargs)
    except Exception as e:
        error_code = getattr(e, "code", 500)
        logger.exception("Service exception: %s", e)
        r = dict_to_json({"message": e.message, "matches": e.message, "error_code": error_code})
        return Response(r, status=error_code, mimetype='application/json')
  return wrapper

Функцияның атын өзгерту мен үшін оны шешті ( wrapper.func_name = func.func_name ):

def exception_handler(func):
  def wrapper(*args, **kwargs):
    try:
        return func(*args, **kwargs)
    except Exception as e:
        error_code = getattr(e, "code", 500)
        logger.exception("Service exception: %s", e)
        r = dict_to_json({"message": e.message, "matches": e.message, "error_code": error_code})
        return Response(r, status=error_code, mimetype='application/json')
  # Renaming the function name:
  wrapper.func_name = func.func_name
  return wrapper

Содан кейін, бір соңғы нүктені безендіру жұмыстары жүргізілді.

30
қосылды
Менің дестесін керемет API-дегі декораторларды пайдаланатын мәселе болды. wrapper .__ name__ = func .__ name __ мәселені шешкенге дейін қаптаманы шақырды.
қосылды автор Tom Wojcik, көзі
wrapper.func_name орнына wrapper .__ name __ қолдануға тура келді. Мүмкін, бұл python2 мен python3 арасындағы айырмашылық бар шығар?
қосылды автор Resonance, көзі
Сондай-ақ, functools.wraps функцияның атын өзгерту үшін.
қосылды автор ryannjohnson, көзі

@ App.route қолданатын пайдаланушылар үшін endpoint кілт-дәлелін пайдалану керек, содан кейін __ атауын __ мәнін Roei Bahumi келтірілген. Оның мысалын қарастырайық:

@app.route("/path1", endpoint='func1')
@exception_handler
def func1():
    pass

@app.route("/path2", endpoint='func2')
@exception_handler
def func2():
    pass
7
қосылды

Флэшк сізге бір «көру функциясын» «соңғы нүктеге» байланыстырады. Екі рет әртүрлі функцияларды жасайтын Main.as_view ('main') деп екі рет қоңырау шаладыңыз (дәл сол функционалдылық, бірақ жад қолтаңбасында әртүрлі). Қысқа әңгіме, сіз жай ғана істеуіңіз керек

main_view_func = Main.as_view('main')

app.add_url_rule('/',
             view_func=main_view_func,
             methods=["GET"])

app.add_url_rule('//',
             view_func=main_view_func,
             methods=["GET"])
4
қосылды

Егер сізде бірегей соңғы нүкте атаулары бар деп ойласаңыз және әлі де осы қате көрсетілсе, онда сіз мәселе </< a>. Маған да осылай болды.

Егер бұл нұсқаңыз бар болса, бұл құтылу үшін төмендегі әрекеттерді орындаңыз:

sudo pip uninstall flask
sudo pip install flask=0.9

1
қосылды

Фласк №570 шығарылымына түзету енгізілді, ол осы алып тастауды тудырады.

See https://github.com/mitsuhiko/flask/issues/796

Сондықтан егер сіз flask/app.py өтіп, 948..951 4 жолға түсініктеме берсеңіз, мәселе жаңа нұсқаға толығымен жаңартылғанша көмектесуі мүмкін.

The diff of that change is here: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1

1
қосылды
Re: «мәселе жаңа нұсқамен толығымен шешілгенге дейін»: «шешілмеген мәселе» жоқ. Мәселе талқыланғаннан кейін, мәселе бойынша кодты алып тастау жағдайында күтілетін нәтиже болып табылады. Қабылданған жауапта түсіндірілгендей, соңғы нүктелер жанжалда. Бұл Flask-нің Пайдаланушы кодынан емес, Фласктің өзі.
қосылды автор Mark Hildreth, көзі

Мен бұған қосымша «үлгі» типті шешімін қосқым келеді.

def func_name(f):
    def wrap(*args, **kwargs):
        if condition:
            pass
        else:
            whatever you want
        return f(*args, **kwargs)
    wrap.__name__ = f.__name__
    return wrap
0
қосылды