用pycharm打开FDJ项目
URL分发器
视图:
视图一般都写在app的view,py中。并且视图的第一个参数永远都是request(一个HttpRequest)对象。这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等。在视图中,一般是完成逻辑相关的操作。比如这个请求使添加一篇博客,那么可以通过request来接收到这些数据,然后存储到数据库中,最后再把执行的结果返回给浏览器。视图函数的返回结果必须是httpResponse对象或者子类的对象。
实例:
创建book app:
(Django-env) python manage.py startapp book
在book app下的views.py中添加:
from django.http import HttpResponse def book_list(request): return HttpResponse("书籍列表:")
URL映射:
回到FDJ目录下的urls.py中:
from book import views urlpatterns = [ path('admin/', admin.site.urls), path('book/', views.book), ]
打开浏览器输入http://127.0.0.1:8000/book/
补充:
视图函数的返回的对象必须为:
URL添加参数:
有时候,url中包含了一些参数需要动态调整。比如简书某篇文章的详情页的url,是https://www.jianshu.com/p/a5aab9c4978e后面的a5aab9c4978e就是这篇文章的id,那么简述的文章详情页面的url就可以写成https://www.jianshu.com/p/<id>,其中id就是文章的id,那么如何在django中实现这种需求呢。这时候我们就可以在path函数中,使用尖括号的形式来定义一个参数。比如我现在想要获取一本书籍的详细信息,那么应该在url中指定这个参数。示例代码如下:
在views.py中添加
def book_detil(request,book_id): #在数据库中根据id提取图书信息 text = book_id return HttpResponse(text)
在urls.py中的urlpatterns中添加
path('book/detil/<book_id>/',views.book_detil),
然后在浏览器网址栏输入http://127.0.0.1:8000/book/1234
当然可以加更多参数,比如
path('book/detil/<book_id>/<categrary>',views.book_detil),
那么views.py中的book_detil必须改成:
def book_detil(request,book_id,categrary): #在数据库中根据id提取图书信息 text = book_id #categrary....categrart的操作。。。 return HttpResponse(text)
另一种url传参数的方式是字符串匹配:
在urls.py中的urlpatterns中添加
path('book/author',views.author_detil),
在views.py中添加
def author_detil(request): author_id = request.GET.get('id') text= author_id return HttpResponse(text)
在浏览器网址栏输入http://127.0.0.1:8000/book/author/?id=111
总结:
1.url映射:
-
为什么会去urls.py文件中寻找映射呢?在'urls.py'中我们所有的映射,都应该放在‘urlpatterns’这个变量这个变量中。
- 是因为在'settings.py'文件中配置了‘ROOT_URLCONF’为'urls.py'。所有django会去'urls.py'中寻找。
- 所有的映射不是随便写的。而是使用'path'的第一个参数中,使用'<参数名>'
2.url传参数:
- 采用在url中使用变量的方式:在path的第一个参数中,使用'<参数名>'的方式可以传递参数。然后在视图函数中也要写一个参数,视图函数中的参数必须和url中的参数名称保持一致,不然就找不到这个参数,另外,url中可以传毒多个参数。
- 采用查询字符串的方式:在url中不需要单独的匹配查询字符串的部分。只需要在视图函数中使用'request.GET.get(参数名称)'的方式来获取。因为查询字符串使用的是'GET'请求,所以我们通过'request.GET'来获取参数。并且因为'GET'是一个类似于字典的数据类型,所有获取取值字典的方式都是一样的。
补充:
URL命名与反URL
1.为什么需要url命名?
- 因为url是经常变换的,如果在代码中写死了可能会经常改代码,给url去个名字,以后使用url的时候就是用他的名字进行反转就可以了,就不需要写死url了。
2.如何给一个url指定名称?
- 在'path'函数中,传递一个'name'参数就可以指定。示例:
urlpatterns = [ path('',views.index,name='index'), ]
应用命名空间:
- 在多个app之间,有可能产生同名的url,这时候为了避免反转rul的时候传声混淆,可以使用命名空间,来做区分,定义应用命名空间非常简单,只需要在'app'的'urls.py'中定义一个叫做'app_name'的变量,来指定这个应用的命名空间即可。示例:
#应用命名空间 app_name = 'front' urlpatterns = [ path('',views.index,name='index') ]
以后在做反转的时候就可以使用'应用命名空间url名称'的方式进行反转,示例:
login_url = reverse('front:index')