django笔记---1
①错误方式如下:如果url中含有正则参数,视图函数中必须传入相应的参数,否则会出现如下错误
url(r'^book/(\d+{4})/', views.index),
def index(request):
return HttpResponse('2000')
②正确方式如下:正则分组中的参数会传入视图函数的参数中,因此视图函数必须加入参数
url(r'^book/(\d{4})/', views.index),
def index(request,year):
print(year)
return HttpResponse(year)
2.需求:访问某年某月出版的书返回给用户
url(r'^book/(\d{4})/(\d{1,2})/', views.index),
def index(request,year,month):
print(year,month)
return HttpResponse(year)
①错误方式如下:如果url中没有参数,视图函数中写了参数,则会出现如下错误
url(r'^book/', views.index),
def index(request,year,month):
print(year,month)
return HttpResponse(year)
2.有名分组:
url(r'^book/(?P<year>\d{4})/(?P<month>\d{1,2})/', views.index),
#相当于参数传入到{"year":2000,“month":12}
def index(request,year,month):
print(year,month)
return HttpResponse(year+month)
#year和month顺序无所谓,但是必须和分组名一样
3.url匹配顺序:
①匹配顺序从上到下,匹配到后就执行,例如输入:/book/2002/12,走第一个url
第一个:url(r'^book/(\d{4})/', views.index),
第二个:url(r'^book/(?P<year>\d{4})/(?P<month>\d{1,2})/', views.index),
②解决方案:完全匹配
第一个:url(r'^book/(\d{4})/$', views.index),
第二个:url(r'^book/(?P<year>\d{4})/(?P<month>\d{1,2})/$', views.index),
4.关于输入url中是否结尾加""问题:
①如果输入不加“\",django会发一个重定向让浏览器加上”\"
②当在setting中设置APPEND_SLASH=False时,如果输入url中部包含“\”会报错
5.视图函数中指定默认值:
6.url路由分发之include:
①在每个app目录下创建一个urls.py文件
匹配过程:用户输入app01/index/,先把前面app01拿出来,后面再到app01应用下去匹配index/
1.根目录下:
urlpatterns = [
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
2.app01目录下:
urlpatterns = [
url(r'^index/', views.index),
]
3.app02目录下:
urlpatterns = [
url(r'^home/', views.home),
]
7.pycharm中提供一个简便的执行python manage.py工具:
8.首页url写法:
①如果按照下面写法,不管url是什么,都只能映射到第一个url路由中
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'',views.base), #空表示什么路径都能匹配到
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
②解决方案如下:写成完全匹配
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',views.base), #空表示什么路径都能匹配到
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
9.应用程序首页url写法:
①在应用程序的url中写完全匹配
10.模板中a标签中写url定位格式为:
①直接写相对路径即可,两边加上"/"
1.模板中:
<a href="/app01/index/">app01应用</a>
<a href="/app02/home/">app02应用</a>
2.根目录中:
urlpatterns = [
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
11.HttpRequest对象:
①输入:http://127.0.0.1:8000/app01/index/?name=123&password=123
1.print(request.GET) # 给请求提交的数据
<QueryDict: {'name': ['123'], 'password': ['123']}>
2.print(request.POST) # 给请求提交的数据
<QueryDict: {}>
3.print(request.META) # 请求头相关信息
一个字典{ 。。。 }包含很多东西
4.print(request.path) # /index/ 路径
/app01/index/
5.print(request.path_info) # /index/ 路径
/app01/index/
6.print(request.get_full_path()) # 完整路径带参数
/app01/index/?name=123&password=123
②表单中的post请求如果为空,表示提交当前页面的url
<form action="" method="post">
用户名: <input type="text" name="username">
密码: <input type="text" name="password">
<button>提交</button>
</form>
③表单中的post请求提交后
1.print(request.POST) # 给请求提交的数据
<QueryDict: {'username': ['123'], 'password': ['123']}>
2.print(request.body) # 提交过来的原始数据
b'username=123&password=123'
12.HttpResponse对象:
①重定向redirect:告诉浏览器让它重新发送请求
def index(request):
return redirect('/app02/home/')