url路由基础
1、在settings.py文件中有一个ROOT_URLCONF设置,设置的是在访问网址时通过哪一个url文件去匹配所请求的网址
2、path参数的使用方法path( articles/int:year/ , views.year_archive) ,使用·尖括号,前边是str代表参数的类型,后面代表参数的名称aa
path参数类型:
捕获url中的参数需要用到尖括号<> 指定尖括号中的值类型比如 int:a str:link这个转换器还有许多类型比如:
int 匹配0和正整数
str 匹配任何空字符串但不包括/
slug 可理解为注释 匹配任何ascii码包括连接线和下划线
uuid 匹配一个uuid对象(该对象必须包括破折号—,所有字母必须小写)
path 匹配所有的字符串 包括/(意思就是path前边和后边的所有)
3、url要复杂一些 (r’blog/(?P[0-9]{4})/′)首先需要开始符和结尾符 /') 首先需要开始符^和结尾符 /)首先需要开始符 和结尾符,参数匹配一个 ()就是一个匹配参数,
(?P<匹配的字段名>正则表达式)
4、进行匹配是不包括get或者post请求方式的参数及域名比如www.qq.com/blog?num=1并不会匹配?后边的字符
5、可以给request参数设置一个默认值,最常见的分页url,比如
urlpatterns=[
url(r ^page/$ ,views.page),
url(r ^page(?P[0-9]+)/ ,views.page),
def page(request,num= 1 ):
pass
<参考资料: https://blog.csdn.net/xiaoyaosheng19/article/details/82709298
https://blog.csdn.net/qq_40272386/article/details/78800507>
参考案例
1 无参数情况
配置URL及其视图如下: (r'^hello/$', hello)
def hello(request):
return HttpResponse( "Hello World" )
访问http://127.0 . 0.1:8000/hello
2 传递一个参数 配置URL及其视图如下,URL中通过正则指定一个参数:
(r '^plist/(.+)/$' , helloParam)
def helloParam(request,param1):
return HttpResponse( "The param is : " + param1)
访问http://127.0.0.1:8000/plist/china
3 传递多个参数 参照第二种情况,以传递两个参数为例,配置URL及其视图如下,URL中通过正则指定两个参数:
(r'^plist/p1(\w+)p2(.+)/$', helloParams)
def helloParams(request,param1,param2):
return HttpResponse(param1 +param2)
访问http://127.0.0.1 :8000/plist/p1chinap22012/ 从这里可以看出,视图的参数是根据URL的正则式,按顺序匹配并自动赋值的。虽然这样可以实现任意多个参数的传递,但是却不够灵活,URL看起来很混乱,而且由于是正则匹配,有些情况下容易出错。
4 通过传统的”?”传递参数 例如,http://127.0.0.1:8000/plist/ ?p1=china&p2=2012 ,url中‘?’之后表示传递的参数,这里传递了p1和p2两个参数。 通过这样的方式传递参数,就不会出现因为正则匹配错误而导致的问题了。在Django中,此类参数的解析是通过request.GET.get方法获取的。 配置URL及其视图如下:
(r'^plist/$' , helloParams1)
def helloParams(request):
p1 = request.GET.get(p1)
p2 = request.GET.get( p2 )
return HttpResponse( "p1 = " + p1 + "; p2 = " + p2)
在python3中使用django2,设置urls的区别
在python3中使用django2的时候,在设置urls的时候常见问题
系统的urls.py里,在1.X的时候,都是采用的url方式。如下
url(r ^ , include(“test1.urls”)),
在2.0中,path模块,所以这里就改写一下。引包
from django.urls import path
path( /app1 , include(“test1.urls”)), 或者path(r /app1 , include(test1.urls))
这里要注意的是,如果要使用path,则要引入path,from django.urls import path
2, 项目的urls.py使用path
1.x里面的写法是
url(r’^page=(\d+)&key=(\w+)$’, views.detail, name=”detail”),
2.x
path( page=(?P\d+)&key=(?P\w+) , views.detail, name=“detail”),
3,关于系统的urls.py里的namespace的问题
1.x中写法
url(r ^ , include(“test1.urls”, namespace= test1 )),
2.X中的写法
app_name = test1
案例对比:
urlpatterns = [
url( articles/(?P[0-9]{4})/ , year_archive),
url( article/(?P<article_id>[a-zA-Z0-9]+)/detail/ , detail_view),
url( articles/(?P<article_id>[a-zA-Z0-9]+)/edit/ , edit_view),
url( articles/(?P<article_id>[a-zA-Z0-9]+)/delete/ , delete_view),]
urlpatterns = [
path( articles/2003/ , views.special_case_2003),
path( articles/<int:year>/ , views.year_archive),
path( articles/<int:year>/<int:month>/ , views.month_archive),
path( articles/<int:year>/<int:month>/<slug>/ , views.article_detail),
]
url获取参数—重点讲url
###1.对urls.py不做处理获取路由上传递的参数
比如: 请求路由为 127.0.0.1:8000/add/log/?a=100/ 传递多个参中间加上 &
views视图函数获取:
def login(request):
a = request.GET[ a ]
或 a = request.GET.get( a )
注意: 推荐使用第二种 不会报错
###2.通过urls.py获取url上的参数
比如: 请求路由为 127.0.0.1:8000/add/login/
urls.py url( r ^login/(\d+)/(\d+)/$ , login, name= login )
views视图函数获取:
def login(request, a, b):
a= a
b = b
注意: 如果是在url路由结尾是否有/或者/$ 建议都有
命名传参:
urls.py url(r ^login/num1(\d+)num2(\w+)/ , login, name= login )
views视图函数
def login(request, num1, num2):
print(num1, num2)
views视图详细讲解
视图函数是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。这个视图函数代码一般约定是放置在项目或应用程序目录中的名为views.py的文件中。
http请求中产生两个核心对象:
1、http请求---->HttpRequest对象,用户请求相关的所有信息(对象)
2、http响应---->HttpResponse对象,响应字符串
视图函数中我们用到的request,就是HttpRequest对象。HttpResponse(),就是HttpResponse对象,它向http请求响应了一段字符串。
视图函数,就是围绕着HttpRequest和HttpResponse这两个对象进行的。
一、HttpRequest对象,request请求信息和属性和方法。
属性和方法包含下面几个:
**1、request.path:**这个主要是用来获取访问文件路径
from django.shortcuts import render,HttpResponse
def index(request):
print(request.path) 不含参数
print(request.get_full_path()) 含参
return render(request, index.html )
request.path的结果是该请求路径不包含参数
request.get_full_path()的结该请求路径包含参数
**2、request.method属性:**获取请求中使用的HTTP方式(POST/GET)
from django.shortcuts import render,HttpResponse
def index(request):
print(request.method)
return render(request, index.html )
**3、request.body属性:**含所有请求体信息 是bytes类型
**4、request.GET,**获取HTTP GET方式请求传参,的参数(字典类型)
from django.shortcuts import render,HttpResponse
def index(request):
print(request.GET)
return render(request, index.html )
5、request.POST,获取POST请求的数据(类字典对象) 请求体里拿值。服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过if request.POST来判断是否使用了HTTP POST 方法;应该使用 if request.method==“POST”。
6、request.FILES,包含所有上传文件的类字典对象;FILES中的每一个Key都是标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:filename:上传文件名,用字符串表示、content_type:上传文件的Content Type、content:上传文件的原始内容。
7、request.GET.get( name ),拿到GET请求里name的值,如果某个键对应有多个值,则不能直接用get取值,需要用getlist,如:request.POST.getlist(“hobby”)。
8、request.user,是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你可以通过user的is_authenticated()方法来辨别用户是否登陆:if request.user.is_authenticated();只有激活Django中的AuthenticationMiddleware时该属性才可用。
9**request.META. **,获取信息
二、HttpResponse响应对象方法和属性。
对于HttpRequest请求对象来说,是由django自动创建的,但是,HttpResponse响应对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse响应对象。HttpResponse类在django.http.HttpResponse。
常见错误状态码: https://blog.csdn.net/qq_24739457/article/details/83989222
https://blog.csdn.net/csdn1844295154/article/details/78980174
常见子类:
HttpResponseRedirect 301
HttpResponsePermanentRedirect 302
HttpResponseNotModified 304
HttpResponseBadRequest 400
HttpResponseForbidden 403
HttpResponseNotFound 404
HttpResponseNotAllowed 405
子类的使用:
def login2(request):
return HttpResponseNotFound(content=“自定义响应”)
1,HttpResponseRedirect
HttpResponseRedirect:重定向一个url
使用方法: return HttpResponseRedirect( /路由名/ ) 注意是完整的路由不包括ip和端口
2、render函数。将指定页面渲染后返回给浏览器。
render(request, template_name, context)
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象。
def index(request):
context = {
blog_index :blog_index,
}
return render(request, index.html ,context)
参数:
request: 用于生成响应的请求对象。
template_name:要使用的模板的完整名称,可选的参数
context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
status:响应的状态码。默认为200。
render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器。这里一定要注意:render渲染的是模板。
3、redirect函数,多用于页面跳转。
redirect的参数可以是:
一个模型:将调用模型的get_absolute_url() 函数
一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
示例:
传递一个对象,将调用get_absolute_url() 方法来获取重定向的URL:
from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object) # object指的是视图函数
传递一个视图的名称,可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL:
def my_view(request):
...
return redirect( some-view-name , foo= bar )
传递要重定向的一个硬编码的URL:
def my_view(request):
...
return redirect( /some/url/ ) # 完整的url
也可以是一个完整的URL:
def my_view(request):
...
return redirect( https://www.django.cn/ )
默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
ef my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
render和redirect两者区别:
第一,假如render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会
第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。
####4, 注意cookie的设置:
cookie和session使用:
----------设置cookie
需要通过response的对象来设置,设置cookie可以通过response.set_cookie来设置,这个方法的相关参数如下:
key:这个cookie的key。
value:这个cookie的value。
max_age:最长的生命周期。单位是秒。
expires:过期时间。跟max_age是类似的,只不过这个参数需要传递一个具体的日期,比如datetime或者是符合日期格式的字符串。如果同时设置了expires和max_age,那么将会使用expires的值作为过期时间。
path:对域名下哪个路径有效。默认是对域名下所有路径都有效。
domain:针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,那么可以设置这个属性.
secure:是否是安全的,如果设置为True,那么只能在https协议下才可用。
httponly:默认是False。如果为True,那么在客户端不能通过JavaScript进行操作。
具体操作:
response=redirect(to= index )
response.set_cookie("username",username,max_age=3600)
return response
def login(request):
#不用模板
response= HttpResponse( test )
response.set_cookie( my_cookie , cookie value )
return response
def login(request):
#用模板
response= render_to_response( xxxx.html , {})
response.set_cookie( my_cookie , cookie value )
return response
----------删除cookie
通过delete_cookie
即可删除cookie
。实际上删除cookie
就是将指定的cookie
的值设置为空的字符串,然后使用将他的过期时间设置为0
,也就是浏览器关闭后就过期。
具体操作:
def login_out(request):
response = HttpResponse(“ok”)
response.delete_cookie(“user_id”)
return response
---------cookie的获取
def index(request):
user_name = request.COOKIES.get( username ) 对应写入是的key
session的值的设置类似:
#session 的设置
if user.exists():
request.session[ username ]=username
return redirect(to= contact )