Python django中url.py中的每个url都应该有它吗';谁有自己的方法来响应请求?

Python django中url.py中的每个url都应该有它吗';谁有自己的方法来响应请求?,python,django,Python,Django,我的测试站点有几个搜索页面,每个页面都包含自己的搜索表单。 但是其中一些页面非常相同,并且它们在视图.py中的显示功能非常相似 例如: @csrf_exempt def rooms(request): submited = False search_option = 'None' search_param = 'None' data = [] query = '' try: cnx = mysql.connector.connec

我的测试站点有几个搜索页面,每个页面都包含自己的搜索表单。 但是其中一些页面非常相同,并且它们在视图.py中的显示功能非常相似

例如:

@csrf_exempt
def rooms(request):
    submited = False
    search_option = 'None'
    search_param = 'None'
    data = []
    query = ''

    try:
        cnx = mysql.connector.connect(user='root', password='****', host='127.0.0.1', database='lessons')
        cursor = cnx.cursor()

        if not submited:
            query = "SELECT * FROM Rooms;"
            cursor.execute(query)
            data = cursor.fetchall()

        if request.method == 'POST':
            submited = True
            if request.POST['search_option'] != "" and request.POST['search_param'] != "":
                search_option = request.POST['search_option']
                search_param = request.POST['search_param']
                query = "SELECT * FROM Rooms WHERE " + search_option + " = " + search_param + ';'
                cursor.execute(query)
                data = cursor.fetchall()

    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            print("Something is wrong with your user name or password")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            print("Database does not exist")
        else:
            print(err)

    return render(request, "rooms.html",
                  {"page_name": "Rooms", "search_option": search_option, "search_param": search_param,
                   "submited": submited, "dbdata": data, "query": query})

@csrf_exempt
def teachers(request):
    submited = False
    search_option = 'None'
    search_param = 'None'
    data = []

    try:
        cnx = mysql.connector.connect(user='root', password='****', host='127.0.0.1', database='lessons')
        cursor = cnx.cursor()

        if submited == False:
            query = "SELECT * FROM Teachers;"
            cursor.execute(query)
            data = cursor.fetchall()

        if request.method == 'POST':
            submited = True
            if 'search_option' in request.POST and 'search_param' in request.POST:
                search_option = request.POST['search_option']
                search_param = request.POST['search_param']
                query = "SELECT * FROM Teachers WHERE " + search_option + " = '" + search_param + "';"
                cursor.execute(query)
                data = cursor.fetchall()

    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            print("Something is wrong with your user name or password")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            print("Database does not exist")
        else:
            print(err)

    return render(request, "teachers.html",
                  {"page_name": "Teachers", "search_option": search_option, "search_param": search_param,
                   "submited": submited, "dbdata": data, "query": query})
我想知道我怎么能让几个类似的搜索URL(有一些非常小的更改,在我的例子中,显示一般结果的是不同的初始SQL查询)引用一个函数(可能是由于一些if语句决定显示哪个页面),而不是几个完全相同的URL,并避免代码重复

url.py

urlpatterns = patterns('',
                       url(r'rooms', 'lessons.views.rooms', name='rooms'),
                       url(r'teachers', 'lessons.views.teachers', name='teachers'),
                       url(r'subjects', 'lessons.views.subjects', name='subjects'))

提前感谢。

请求路由器配置(您可以称之为
url.py
)正是为了将请求映射和查看代码分开。您还可以将其用于视图重用

如果您查看django自己的一些示例,您会发现:

(r'^about/', TemplateView.as_view(template_name="about.html"))
这或多或少正是您的建议:对不同类型的URL重复使用相同的视图代码。您也可以在普通视图中模拟它:

def my_view(request, param=None):
   [...]

from functools import partial

url(r'^my_view0/', partial(views.my_view, param=0)),
url(r'^my_view1/', partial(views.my_view, param=1))

您可以从每个url使用相同的视图功能,比如说
lessons.views.generic\u view
,您可以根据视图的名称进行区分,如下所示:

from django.core.urlresolvers import resolve

def generic_view(request):
    view_name = resolve(request.path).view_name
    if view_name == 'teachers':
         ...
您的示例
url.py

urlpatterns = patterns('',
    url(r'rooms', 'lessons.views.generic_view', name='rooms'),
    url(r'teachers', 'lessons.views.generic_view', name='teachers'),
    url(r'subjects', 'lessons.views.generic_view', name='subjects')
)

为什么要使用原始SQL而不是模型和ORM调用?@DanielRoseman,这只是我们老师的任务。下一步的工作将涉及ORM。我想这个实验室应该向我们展示使用ORM的优势。我想这违反了PEP-20,第二行。有一个更明确的途径可以做到这一点。