AssertionError: ফাংশন ম্যাপিং দেখুন একটি বিদ্যমান শেষ পয়েন্ট ফাংশন ওভাররাইট করছে: প্রধান


86

কেউ যদি জানেন যে আমার কাছে এইরকম দুটি ইউআরএল নিয়ম থাকে তবে কেন আমি একটি বিদ্যমান এন্ডপয়েন্ট ফাংশনটি ওভাররাইট করতে পারি না

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

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

ট্রেসব্যাক:

Traceback (most recent call last): 
  File "demo.py", line 20, in <module> 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

আপনি কি জিজ্ঞাসা করছেন আপনি কীভাবে পারেন বা কেন পারেন?
মাইকেল ডেভিস

4
কেন এটি কাজ করে না আমি টিউটোরিয়াল অনুসরণ করছি
কিমি

4
যদি কেউ জানতে আগ্রহী হন যে কেন ফ্লাস্কের অনন্য ভিউ নামের এই সীমানাটি একই অনুরূপ প্রশ্নের আমার উত্তর দেখতে পায়: stackoverflow.com/a/47558985/4440675 এই উত্তরটি ব্যাখ্যা করে যে প্রতিটি পদ্ধতির অনন্য নাম রাখার পিছনে যুক্তিটি কীভাবে চলে।
অমিত ত্রিপাঠি

উত্তর:


67

আপনার দর্শনের নামগুলি একই ভিউ পদ্ধতির দিকে ইঙ্গিত করলেও অনন্য হওয়া দরকার।

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

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

অন্য কথায়, .as_view($VIEW_NAME)পদ্ধতি কলটিতে $ VIEW_NAME অনন্য স্ট্রিংয়ের নাম হিসাবে পাস করা উচিত।
ডেভি

112

এই একই সমস্যাটি আমার সাথে ঘটেছিল যখন আমি মডিউলে একাধিক এপিআই ফাংশন ছিলাম এবং প্রতিটি ফাংশনটি 2 সজ্জকারের সাথে মোড়ানোর চেষ্টা করেছি:

  1. @ app.route ()
  2. আমার কাস্টম @ এক্সেকশন_হ্যান্ডলার সাজসজ্জা

আমি এই একই ব্যতিক্রম পেয়েছি কারণ আমি এই দুটি সজ্জকারের সাথে একাধিক ফাংশন মোড়ানোর চেষ্টা করেছি:

@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

ফাংশনটির নাম পরিবর্তন করা আমার পক্ষে এটি সমাধান হয়েছে ( মোড়ক .__ নাম__ = ফানক __ নাম__ ):

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.__name__ = func.__name__
  return wrapper

তারপরে, একাধিক প্রান্তকে সাজানোর কাজ করা হয়েছিল।


28
আপনি functools.wrapsফাংশনটির পুনরায় নাম অর্জন করতেও ব্যবহার করতে পারেন ।
রায়ানঞ্জোহসন 22

4
এর wrapper.__name__পরিবর্তে আমাকে ব্যবহার করতে হয়েছিল wrapper.func_name। সম্ভবত এটি পাইথন 2 এবং পাইথন 3 এর মধ্যে পার্থক্য?
অনুরণন

4
আমার ফ্লাস্ক রেস্টফুল এপিআরটিতে সজ্জা ব্যবহারকারীগুলির সমস্যাটি ছিল। wrapper.__name__ = func.__name__র্যাপার কল করার আগে সমস্যার সমাধান হয়েছিল।
টম ওয়াজিক

29

@ App.route ব্যবহারকারী ব্যবহারকারীদের পক্ষে মূল যুক্তিটি ব্যবহার করা আরও ভাল, endpointতারপরে রোই বাহুমীর__name__ মত বর্ণিত মানটির পরিবর্তে ing তার উদাহরণ গ্রহণ করা হবে:

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

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

9

ফ্লাস্কের জন্য আপনাকে একটি একটি 'ভিউ ফাংশন' 'এন্ডপয়েন্ট' এর সাথে যুক্ত করতে হবে। আপনি 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('/<page>/',
             view_func=main_view_func,
             methods=["GET"])

7

আমি এটি আরও একটি 'টেম্পলেট' টাইপ সমাধান যোগ করতে চাই।

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

আমি সম্প্রতি একটি সত্যই আকর্ষণীয় নিবন্ধ "ডিমেস্টিফাইং ডিজাইটার" যুক্ত করতে চাই যা আমি সম্প্রতি পেয়েছি: https://sumit-ghosh.com/articles/demystifying-decorators-python/


4

আপনার যখন বিভিন্ন রুটে অভিন্ন ফাংশনের নাম থাকে তখন এটিও ঘটতে পারে।


2

যদি আপনি ভাবেন যে আপনার অনন্য এন্ডপয়েন্টের নাম রয়েছে এবং এখনও এই ত্রুটিটি দেওয়া হয় তবে সম্ভবত আপনি সমস্যার মুখোমুখি হচ্ছেন । আমার ক্ষেত্রেও একই অবস্থা ছিল।

এই সমস্যাটি ফ্লাস্ক 0.10 এর সাথে রয়েছে যদি আপনার একই সংস্করণ থাকে তবে এ থেকে পরিত্রাণ পেতে নিম্নলিখিতগুলি করুন:

sudo pip uninstall flask
sudo pip install flask=0.9

1

ফ্লাস্ক ইস্যু # 570 প্রবর্তিত সাম্প্রতিক (ফ্ল্যাশক 0.10) এর জন্য একটি ঠিক আছে যা এই ব্যতিক্রমটি উত্থাপিত করে causes

Https://github.com/mitsuhiko/flask/issues/796 দেখুন

সুতরাং আপনি যদি ফ্লাস্ক / অ্যাপ.পি যান এবং 4 টি লাইন 948..951 তে মন্তব্য করেন তবে সমস্যাটি নতুন সংস্করণে পুরোপুরি পুনর্বিবেচিত হওয়া পর্যন্ত এটি সাহায্য করতে পারে।

পরিবর্তনের পার্থক্যটি এখানে: http://github.com/mitsuhiko/flask/commit/661ee54bc2bc1ea0763ac9c226f8e14bb0beb5b1


4
পুনরায়: "যতক্ষণ না সমস্যাটি একটি নতুন সংস্করণে পুরোপুরি সমাধান করা হয়": সমাধান করার মতো কোনও "সমস্যা" নেই। ইস্যু আলোচনাটি যেমন দেখিয়েছে, প্রশ্নের কোডের ক্ষেত্রে একটি ব্যতিক্রম উত্থাপন প্রত্যাশিত ফলাফল। গৃহীত উত্তরে বর্ণিত হিসাবে, শেষের পয়েন্টগুলি বিরোধে রয়েছে। ফ্লাস্কের ব্যবহারকারীর কোডে এটি একটি ত্রুটি, ফ্লাস্কে নয়।
মার্ক হিলড্রেথ

0

আপনার দর্শনের নামগুলি একই দৃষ্টিভঙ্গি পদ্ধতির দিকে ইঙ্গিত করা থাকলেও অনন্য হওয়া দরকার, বা আপনি ফান্টুলগুলি আমদানি মোড়কগুলি থেকে যোগ করতে পারেন এবং https://docs.python.org/2/library/functools.html ব্যবহার করতে পারেন


0

পরিবর্তে নিম্নলিখিত কমান্ড ব্যবহার ফ্ল্যাশক 0.9 ব্যবহার করুন sudo pip uninstall flask

sudo pip install flask==0.9

0

@wraps(f)মোড়ক ফাংশন উপরে যোগ করা আমার সমস্যা সমাধান করেছে।

def list_ownership(f):
    @wraps(f)
    def decorator(*args,**kwargs):
        return f(args,kwargs)
    return decorator
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.