Python url以及views视图函数

1url路由基础

1、在settings.py文件中有一个ROOT_URLCONF设置,设置的是在访问网址时通过哪一个url文件去匹配所请求的网址

2、path参数的使用方法path( articles/int:year/ , views.year_archive) ,使用·尖括号,前边是str代表参数的类型,后面代表参数的名称year
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

参考案例

1 无参数情况
配置URL及其视图如下:  
url(r'^hello/$', hello)  
def  hello(request):
        return   HttpResponse( "Hello World" )
 访问http://127.0.0.1:8000/hello
        
 2  传递一个参数 配置URL及其视图如下,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[a-zA-Z0-9]+)/detail/ , detail_view),

​ url( articles/(?P[a-zA-Z0-9]+)/edit/ , edit_view),

​ url( articles/(?P[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获取参数

###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.META:**请求信息

**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时该属性才可用。

二、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 可以返回一个永久的重定向。

示例:

将调用具体ORM对象的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.baidu.com/)

默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:

301永久重定向是一种非常重要的“自动转向”技术,是网址重定向最为可行的一种办法。当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。

ef my_view(request):
    ...
    object = MyModel.objects.get(...)
    return redirect(object, permanent=True)  

4 render和redirect两者区别:

第一,假如render返回一个登陆成功后的页面,刷新该页面将回复到跳转前页面。而redirect则不会

第二,如果页面需要模板语言渲染,需要的将数据库的数据加载到html,那么render方法则不会显示这一部分,render返回一个登陆成功页面,不会经过url路由分发系统,也就是说,不会执行跳转后url的视图函数。这样,返回的页面渲染不成功;而redirect是跳转到指定页面,当登陆成功后,会在url路由系统进行匹配,如果有存在的映射函数,就会执行对应的映射函数。

5, 注意cookie的设置:

cookie和session使用:

需要通过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进行操作。

加盐:

普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看

response.set_signed_cookie('kk', 'uu', salt='as')

具体操作:

​ ------------设置cookie



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

6, session的值的设置类似:

#session 的设置
         if user.exists():
             request.session[ username ]=username
             return redirect(to= contact )

# 获取、设置、删除Session中数据

使用session的操作 对象及方法

1)使用键值对的格式写 session request.session[‘key’]=value

2)根据键 取 值 request.session.get(‘key’, 默认值)

3)清除所有session,在存储中删除值部分 request.session.clear()

4)清除session数据,在存储中删除session的整条数据。 request.session.flush()

5)删除session中的指定键及值 del request.session[‘key’]

6)设置会话的超时时间 单位s request.session.set_expiry(value)

6, cookie与session的区别

1.cookie和session都是会话技术,cookie是运行在客户端,session是运行在服务器端。

2.cookie由大小限制以及浏览器在存cookie的个数也是有限的,session是没有大小限制和服务器的内存大小有关。

3.cookie由安全隐患,通过拦截或本地找到cookie后可以进行攻击。

4.session是保存子服务器端上,存在一段时间才会消失,如果session过多会增加服务器的压力。

你可能感兴趣的:(Python url以及views视图函数)