我的django笔记---1

1.需求:访问某年出版的书返回给用户

①错误方式如下:如果url中含有正则参数,视图函数中必须传入相应的参数,否则会出现如下错误

url(r'^book/(\d+{4})/', views.index),


def index(request):
    return HttpResponse('2000')

1

②正确方式如下:正则分组中的参数会传入视图函数的参数中,因此视图函数必须加入参数

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)

image-20200620121754642

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会发一个重定向让浏览器加上”\"

image-20200620125445627

②当在setting中设置APPEND_SLASH=False时,如果输入url中部包含“\”会报错

image-20200620130143475

5.视图函数中指定默认值:

image-20200620130829888

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工具:

image-20200620133832820

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中写完全匹配

image-20200620141134042

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对象:

image-20200620152434349

①重定向redirect:告诉浏览器让它重新发送请求

def index(request):
    return redirect('/app02/home/')

image-20200620153504724

posted @ 2020-06-20 15:51  小凡2019  阅读(76)  评论(0编辑  收藏  举报