url以及views的详细讲解(1)

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 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值