2.url与视图函数

 

视图函数

  1. 视图函数的第一个参数必须是request,这个参数绝对不能少。
  2. 视图函数的返回值必须是django.http.response.HttpResponseBase的子类的对象。

url传递参数:

url映射:

  1. 为何会去urls.py文件中寻找映射呢?
    是由于在setting.py文件中配置了ROOT_URLCONFurls.py 因此Django会去urls.py
    中去寻找.
  2. urls.py中咱们全部的映射,都应该放在urlpattenrs这个变量中.
  3. 全部的映射不是随便写的,而是使用path函数或者re_path函数进行包装的.

url传参数

  1. 采用在url中使用变量的方式:在path的第一个参数中,使用<参数名>的方式能够传递参数.
    而后在视图函数中也要写一参数,视图函数中的参数必须和url中的参数名名称保持一致,否则就找不到这个参数.另外,url中能够传递多个参数.示例代码以下:
    urlpatterns = [
            path('admin/', admin.site.urls),
            path('book/<book_id>/', views.book),
        ]
        def book(request,book_id):
            text = '书的id是%s' % book_id
            return HttpResponse(text)
  2. 采用查询字符串的方式:在url中,不须要单独的匹配查询字符串的部分.只须要在视图函数中使用
    request.GET.get('参数名称')的方式来获取.示例代码以下:
def authoer_detail(request):
        author_id = request.GET('id')
        text = '做者的id是:%s' % author_id
        return HttpResponse(text)
        pass


由于查询字符串使用的是GET请求,因此咱们经过request.GET来获取参数.而且由于
GET是一个相似字典的数据类型,因此获取值跟字典的方式都是同样的.javascript

url参数的转换器:

  1. str: 除了斜杠/觉得全部的字符都是能够的.
  2. int: 只you是一个或者多个的阿拉伯数字.
  3. path: 全部的字符都是知足的.
  4. uuid: 只有知足uuid.uuid4()这个函数返回的字符串的格式.
  5. slug: 英文中的横杠或者英文字符或者阿拉伯数字或者下划线才知足.

urls模块化

若是项目变得愈来愈大.那么url会变得愈来愈多.若是都放在了住urls.py文件中,那么将
不太好管理,所以咱们能够将每一个app本身的urls都放到本身的app中进行管理.通常咱们会在app中
新建一个urls.py文件用来存储全部和这个app相关的子url.
须要注意的地方:
1. 应该使用include函数包含子urls.py,而且这个urls.py的路径是相对于项目的路径.
示例代码以下html

urlpatterns = [
    path('admin/',admin.site.urls),
    path('book',include('book.urls'))
]


2. 在appurls.py中,全部的url匹配也要放在一个叫作urlpatterns的变量中,不然找不到
3. url是会根据主urls.py和app中的urls.py进行拼接的,所以注意不要多加斜杠/.java

include函数的用法:

1.include(module,namespace=None):
* module: 子url的模块字符串.
* namespace:实例命名空间.这个地方须要注意一点.若是制定实例命名空间,那么前提必需要先制定应用命名空间,也就是在子urls.py中添加app_name变量.
2. include((pattern_list,app_namespace),namespace=None):include函数的第一个参数既能够为一个字符串,也能够为一个元组.若是是元组,那么元组的第一个参数是子urls.py模块的字符串,元组的第二个参数是应用命名空间.也就是说,应用命名空间既能够在子urls.py中经过app_name制定,也能够在include函数中制定.
3. include(pattern_list):pattern_list是一个列表,这个列表中装的是path或者re_path函数.实例代码以下:python

urlpatterns = [
    path('admin/',admin.site.urls),
    # 没有制定应用命名空间,直接制定的是实例命名空间
    path('book/',include(('book.urls','book'))),
    path('movie/',include([
        path('',views.movie),
        path('list/',views.movie_list),
        ]))
]

url命名

为何须要url命名?

由于url是常常变化的,若是在代码中写死,那么后期更改会很是的麻烦.给url取个名字,之后使用url的时候就使用他的名字进行反转就能够了,就不须要写死url了.ios

如何给一个url制定名称?

path函数中,传递一个name参数就能够制定.示例代码以下:web

urlpatterns = [
    path('',views.index,name='index'),
    path('login/',views.login,name='login')
]

应用命名空间:

在多个APP之间,有可能产生同名的url,这时候为了不反转url的时候产生混淆,可使用应用命名空间,来作区分.定义应用命名空间很是简单,只要在appurls.py中定义一个叫作app_name的变量,来制定这个应用的命名空间便可.示例代码以下:django

# 应用命名空间
app_name = 'front'


之后在作反转的时候就可使用应用命名空间:url名称的方式进行反转.示例代码以下:api

login_url = reverse('front:login')

应用命名空间(app)和实例命名空间:

一个app,能够建立多个实例.可使用多个url映射同一个app,全部这就会产生一个问题.之后在作反转的时候,若是使用应用命名空间,那么就会发生混淆.为了不这个问题,咱们可使用实例命名空间.实例命名空间也是很是简单的,只要在include函数中传递一个namespace变量便可.示例代码以下:markdown

URLpatterns = [
    path('admin/',admin.site.urls),
    path('',include('frons.urls')),
    # 同一个app 下you两个实例
    path('cms1/',include('csm.urls',namespace='cms1')),
    path('cms2/',include('csm.urls',namespace='cms2')),
]


之后在作反转的时候,就能够根据实例命名空间来制定具体的url.示例代码以下:app

def index(request):
    username = request.GET.get("username")
    if username:
        return HttpResponse('CMS首页')
    else:
        # 获取当前的命名空间
        current_namespace = request.resolver_match.namespace
        return redirect(reverse('%s:login'%current_namespace))
相关文章
相关标签/搜索