python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统

一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View)    示例:    def add_book(request):    pub_obj=models.Publisher.objects.all()  #从数据库获取全部出版社对象    if request.method==‘POST‘:        add_name=request.POST.get(‘book_name‘)        pub_id=request.POST.get(‘pub_id‘)        models.Book.objects.create(name=add_name,publisher_id=pub_id)        return redirect(‘/book/‘)    return render(request,‘add_book.html‘,{"pub_obj":pub_obj})2.基于类的view,就叫CBV (Class Based View)先在urls.py 中修改对应关系    如 : url(r‘^add_book‘,views.Addbook.as_view()),=======>url(r‘^add_book‘,view)    解析过程:        as_view是一个类方法 return view,        view 是一个函数   实例化一个对象; 封装request属性;return self.dispatch(self, request, *args, **kwargs)        dispatch是一个函数:        if request.method.lower() in self.http_method_names:        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)  通过反射来操作对象属性或方法        return handler(request, *args, **kwargs)    补充:   八种请求方法         http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘]views中写类    from django.views import View    示例:    class Addbook(View):

def dispatch(self, request, *args, **kwargs):            # print("函数之前")            ret=super(Addbook, self).dispatch(request, *args, **kwargs)            # print("函数之后")            return ret

def get(self,request):            pub_obj = models.Publisher.objects.all()            return render(request,‘add_book.html‘,{"pub_obj":pub_obj})

def post(self,request):            add_name = request.POST.get(‘book_name‘)            pub_id=request.POST.get(‘pub_id‘)            models.Book.objects.create(name=add_name,publisher_id=pub_id)            return redirect(‘/book/‘)二.加装饰器装饰器def wrapper(func):    def inner(*args,**kwargs):        start=time.time()        ret=func(*args,**kwargs)        print("执行时间为:{}".format(time.time()-start))        return ret    return inner(一)FBV    @wrapper      #加装饰器    def add_book(request):        pub_obj=models.Publisher.objects.all()  #从数据库获取全部出版社对象        if request.method==‘POST‘:            add_name=request.POST.get(‘book_name‘)            pub_id=request.POST.get(‘pub_id‘)            models.Book.objects.create(name=add_name,publisher_id=pub_id)            return redirect(‘/book/‘)        return render(request,‘add_book.html‘,{"pub_obj":pub_obj})(二).CBV    首先导入:from django.utils.decorators import method_decorator    1.直接给类加装饰器        @method_decorator(wrapper,name="post")     #给post加装饰器        @method_decorator(wrapper,name="get")      #给get加装饰器        class Addbook(View):         ...    2.给dispatch加装饰器(同时给get和post加装饰器)         @method_decorator(wrapper)             #同时给get和post加装饰器        def dispatch(self, request, *args, **kwargs):        ...    3.分别给get和post加装饰器        a.  @method_decorator(wrapper)               #只给get方法加装饰器            def get(self,request):            ...        b.  @method_decorator(wrapper)               #只给post方法加装饰器  可以同时存在            def post(self,request):            ...三.Request对象和Response对象(一)Request 对象    当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。    Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。    def test(request):    1.属性    print(request,type(request))        #<WSGIRequest: GET ‘/test/‘> <class ‘django.core.handlers.wsgi.WSGIRequest‘>    print(request.method)               #GET    print(request.GET)                 #<QueryDict: {}>    print(request.POST)                #<QueryDict: {}>    print(request.path_info)           #/test/JHHK    (不包括域名,只有路径)    print(request.body)                #如果是get: b‘‘; 如果是post:b‘请求体‘    print(request.scheme)              # 协议 http    print(request.encoding)             #None表示提交的数据的编码方式                # (如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 ‘utf-8‘)。    print(request.COOKIES)             # 一个标准的Python 字典,包含所有的cookie。键和值都为字符串    print(request.FILES)文件上传  Request.FILES    views:        def upload(request):            if request.method==‘POST‘:                file_obj=request.FILES.get(‘upload‘)                print(file_obj.name)                with open(file_obj.name, ‘wb‘) as f:                    for chunk in file_obj.chunks():                        f.write(chunk)            return render(request,‘upload.html‘)    html:        <form action="" method="post" enctype="multipart/form-data">            <input type="file" name="upload">            <button type="submit">提交</button>        </form>        # 注意: form中一定要写 enctype="multipart/form-data"    补充:        一个类似于字典的对象,包含所有的上传文件信息。        FILES 中的每个键为<input type="file" name="" /> 中的name,值则为对应的数据。      注意,FILES 只有在请求的方法为POST 且提交的<form> 带有enctype="multipart/form-data" 的情况下才会       包含数据。否则,FILES 将为一个空的类似于字典的对象。        POST 请求中用到        file_obj = request.FILES.get(‘file_name‘)    2.方法     (1)print(request.get_host())          # 127.0.0.1:8000         根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。         如果这两个头部没有提供相应的值,则使用SERVER_NAME 和SERVER_PORT,在PEP 3333 中有详细描述。      USE_X_FORWARDED_HOST:一个布尔值,用于指定是否优先使用 X-Forwarded-Host 首部,仅在代理设置了该首部的情况下,才可以被使用。      例如:"127.0.0.1:8000"      注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。

(2)print(request.get_full_path())     # /test/123456789?asdafd=2143242&sdsdsf=sdsdfdsf(路径+?+查询内容)        返回 path,如果可以将加上查询字符串。      例如:"/music/bands/the_beatles/?print=true"    (3) print(request.is_secure())             #False        如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。    (4)print(request.is_ajax())               #False       如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串‘XMLHttpRequest‘。      大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。      如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware,        你应该使用 vary_on_headers(‘HTTP_X_REQUESTED_WITH‘) 装饰你的视图以让响应能够正确地缓存    (5)HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None)      返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。      如果提供 default 参数,将不会引发异常并返回 default 的值。      可选参数salt 可以用来对安全密钥强力攻击提供额外的保护。max_age 参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age 秒。        代码示例:         >>> request.get_signed_cookie(‘name‘)        ‘Tony‘        >>> request.get_signed_cookie(‘name‘, salt=‘name-salt‘)        ‘Tony‘ # 假设在设置cookie的时候使用的是相同的salt        >>> request.get_signed_cookie(‘non-existing-cookie‘)        ...        KeyError: ‘non-existing-cookie‘    # 没有相应的键时触发异常        >>> request.get_signed_cookie(‘non-existing-cookie‘, False)        False        >>> request.get_signed_cookie(‘cookie-that-was-tampered-with‘)        ...        BadSignature: ...        >>> request.get_signed_cookie(‘name‘, max_age=60)        ...        SignatureExpired: Signature age 1677.3839159 > 60 seconds        >>> request.get_signed_cookie(‘name‘, False, max_age=60)        False(二)Response对象(  HttpResponse , JsonResponse )    与由Django自动创建的HttpRequest对象相比,HttpResponse对象是我们的职责范围了。我们写的每个视图都需要实例化,    填充和返回一个HttpResponse。 1.HttpResponse对象   HttpResponse类位于django.http模块中。    属性:    (1) print(HttpResponse.content)        #<property object at 0x000001C0A0182638>响应内容    (2)print(HttpResponse.charset)        #<property object at 0x000001C0A01648B8>响应内容编码    (3)print(HttpResponse.status_code)     #200响应内容的编码    使用:    (1).传递字符串        from django.http import HttpResponse        response = HttpResponse("Here‘s the text of the Web page.")    (2).设置或删除响应头信息        response = HttpResponse()        response[‘Content-Type‘] = ‘text/html; charset=UTF-8‘        del response[‘Content-Type‘] 2.JsonResponse         JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。    (1)from django.http import JsonResponse   导入    response = JsonResponse({‘foo‘: ‘bar‘})    print(response.content)    #  b‘{"foo": "bar"}‘    print(response.charset)   #  utf-8    print(esponse.status_code)   #200注意:    默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。    response = JsonResponse([1, 2, 3], safe=False)四.Django shortcut functions(一).render()    参数:        request: 用于生成响应的请求对象。        template_name:要使用的模板的完整名称,可选的参数        context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。        content_type:生成的文档要使用的MIME类型。默认为 DEFAULT_CONTENT_TYPE 设置的值。默认为‘text/html‘        status:响应的状态码。默认为200。        useing: 用于加载模板的模板引擎的名称。    示例:    简洁版        from django.shortcuts import render        def my_view(request):            # 视图的代码写在这里            return render(request, ‘myapp/index.html‘, {‘foo‘: ‘bar‘})    原版:        结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象        from django.http import HttpResponse        from django.template import loader        def my_view(request):            # 视图代码写在这里            t = loader.get_template(‘myapp/index.html‘)            c = {‘foo‘: ‘bar‘}            return HttpResponse(t.render(c, request))

(二).redirect()    参数可以是:        一个模型:将调用模型的get_absolute_url() 函数        一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称        一个绝对的或相对的URL,将原封不动的作为重定向的位置。        默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。    使用:        (1)传递一个具体的ORM对象(了解即可)            from django.shortcuts import redirect            def my_view(request):                ...                object = MyModel.objects.get(...)                return redirect(object)        (2)传递一个视图的名称            def my_view(request):                ...                return redirect(‘some-view-name‘, foo=‘bar‘)        (3)传递要重定向到的一个具体的网址            def my_view(request):                ...                return redirect(‘/some/url/‘)        (4)一个完整的网址            def my_view(request):                ...                return redirect(‘http://example.com/‘)补充:临时重定向(响应状态码:302)和永久重定向(响应状态码:301)对普通用户来说是没什么区别的,它主要面向的是搜索引擎的机器人。

五.路由系统    URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。(一).URLconf配置基本语法    from django.conf.urls import url    urlpatterns = [         url(正则表达式, views视图,参数,别名),    ](二)参数说明:    正则表达式:一个正则表达式字符串    views视图:一个可调用对象,通常为一个视图函数    参数:可选的要传递给视图函数的默认参数(字典形式)    别名:一个可选的name参数注意:    Django 2.0版本中的路由系统是下面的写法    from django.urls import path,re_path    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:slug>/‘, views.article_detail),    ](三)正则详解    1.基本配置        from django.conf.urls import url        from app01 import views        urlpatterns = [            url(r‘^articles/2003/$‘, views.special_case_2003),            url(r‘^articles/([0-9]{4})/$‘, views.year_archive),            url(r‘^articles/([0-9]{4})/([0-9]{2})/$‘, views.month_archive),            url(r‘^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$‘, views.article_detail),        ]    2.注意事项        (1)urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。        (2)若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)        (3)不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。        (4)每个正则表达式前面的‘r‘ 是可选的但是建议加上.    3.补充说明        (1)是否开启URL访问地址后面不为/跳转至带有/的路径的配置项            APPEND_SLASH=True        (2)Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。        其作用就是自动在网址结尾加‘/‘。

示例:        from django.conf.urls import url        from app01 import views        urlpatterns = [            url(r‘^blog/$‘, views.blog),        ]    效果 : 访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。    如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面(四)分组命名匹配    使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图    同样还可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键字参数形式传递给视图    在Python的正则表达式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名称,pattern是要匹配的模式。    通过(?P<name>pattern)捕获的值作为关键字参数而不是位置参数传递给视图函数    1.URLconf匹配的位置        URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。        例如,http://www.example.com/myapp/ 请求中,URLconf 将查找 /myapp/ 。        在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 /myapp/ 。        URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POST、GET、HEAD等等 —— 都将路由到相同的函数。    2.捕获的参数永远都是字符串        每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式        url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive),        传递到视图函数views.year_archive() 中的year参数永远是一个字符串类型    3.视图函数中指定默认值        # urls.py中            from django.conf.urls import url            from . import views            urlpatterns = [                 url(r‘^page/$‘, views.page),  先匹配上它,没有获取到值,使用默认值                 url(r‘^page/(?P<num>[0-9]{4})/$‘, views.page)            ]        # views.py中,            可以为num指定默认值            def page(request,num=1):                print(num)                return HttpResponse(‘ok‘)    在上面的例子中,两个URL模式指向相同的view - views.page - 但是第一个模式并没有从URL中捕获任何东西。    如果第一个模式匹配上了,page()函数将使用其默认参数num=“1”,如果第二个模式匹配,page()将使用正则表达式捕获到的num值。    4.include其他的URLconfs        from django.conf.urls import include, url        urlpatterns = [           url(r‘^admin/‘, admin.site.urls),           url(r‘^blog/‘, include(‘blog.urls‘)),  # 可以包含其他的URLconfs文件](五)传递额外的参数给视图函数    URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数。    django.conf.urls.url() 可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。    from django.conf.urls import url    from . import views    urlpatterns = [        url(r‘^blog/(?P<year>[0-9]{4})/$‘, views.year_archive, {‘foo‘: ‘bar‘}),]在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year=‘2005‘, foo=‘bar‘)。当传递额外参数的字典中的参数和URL中捕获值的命名关键字参数同名时,函数调用时将使用的是字典中的参数,而不是URL中捕获的参数。示例:    url(r‘^book/([0-9]{4})/([0-9]{2})/$‘, views.book,{‘foo‘:‘bar‘})    def book(request,*args,**kwargs):        #http://127.0.0.1:8000/book/2018/09/        # print(args)   #(‘2018‘, ‘09‘)        # print(kwargs)  # {‘foo‘: ‘bar‘}   额外加参数        return HttpResponse(‘ok‘)

原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9637586.html

时间: 2024-09-30 06:53:21

python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统的相关文章

ASP.NET之Request和Response对象

经过了牛腩新闻公布系统和html的学习对B/S开发的流程有了些理解.前面尽管用到了非常多知识.但对制作网页仅仅能说知其然.当学到asp.net视频中的解说才干够说開始知其所以然了. 今天来说说client与server之间进行交流用到的Request和Response对象. Request:用户在client使用Web浏览器向Web应用程序发出请求时,会将client信息发给server.server收到一个HTTP请求,包括了全部查询字符串參数或表单參数.Cookie数据以及浏览器信息. 在a

Flask 的 request 和 response 对象

Request 和 Response 对象的属性中,有一些是元数据,有一些是解析后的数据,还有一些只是链接. Request method 起始行,元数据 host 起始行,元数据 path 起始行,元数据 environ 其中的 SERVER_PROTOCOL 是起始行,元数据 headers 头,元数据 data body, 元数据 remote_addr 客户端地址 args 请求链接中的参数(GET 参数),解析后 form form 提交中的参数,解析后 values args 和 f

Request和Response对象

最早接触Request和Response对象的时候是听王勇老师将Servlet的时候,我们编写一个Servlet类.我们在浏览器端发送一个url请求之后,会调用Servlet类对这个请求做相应的处理,Servlet类就是通过重写的service()方法来实现的,而我们知道的Request和Response对象就是作为service()方法的参数传入的.   1.整体印象 2.Request对象 Request对象的主要职责是获得HTTP请求中封装的信息,获得url和表单参数:还有一个功能就是对页

request与response对象.

request与response对象. 1. request代表请求对象 response代表的响应对象. 学习它们我们可以操作http请求与响应. 2.request,response体系结构. 在我们Servlet中使用的request与response HttpServletRequest接口------>父接口  ServletRequest HttpServletResponse接口----->父接口  ServletResponse 在tomcat中它采用门面模式对requst,r

获得request、response对象的三种方法

方法一 //struts获取方法 // HttpServletRequest request = ServletActionContext.getRequest(); //  HttpServletResponse response = ServletActionContext.getResponse(); 方法二 //SpringMvc获取方法 HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolde

request和response对象的具体介绍

Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性.常见属性有: req.app:当callback为外部文件时,用req.app访问express的实例 req.baseUrl:获取路由当前安装的URL路径 req.body / req.cookies:获得「请求主体」/ Cookies req.fresh / req.stale:判断请求是否还「新鲜」 req.hostname / req.ip:获取主机名和IP地址 r

Django Request 与Response对象

Django使用请求和响应对象在系统中传递状态.当请求页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据. 然后Django加载适当的视图,将HttpRequest作为第一个参数传递给视图函数.每个视图都负责返回HttpResponse对象. 一.HttpRequest HttpRequet.schema:所使用的Http协议(http,https) HttpRequest.body:请求体 HttpRequest.path:表示请求页面的完整路径的字符串,不包括

request和response对象如何解决中文乱码问题?

出现中文乱码的问题,一般的原因编码和和解码不一致造成的. 1 /* 2 乱码:编码和解码不一致导致的 3 GET:你好 4 POST:?????? 5 tomcat版本:8.5及以上版本 6 GET请求方式,request对象使用的字符集默认为utf-8 7 POST请求方式,request对象使用的字符集默认为ISO8859-1 8 解决: 9 设置request对象的字符集为utf-8 10 request.setCharacterEncoding("utf-8"); 11 tom

在springMVC的controller中获取request,response对象的一个方法

使用springMVC的时候,有些时候会需要获取请求或者响应对象,例如在身份验证的时候,需要获取请求头中的token,在做登录系统的时候需要使用response对象向客户端添加cookie,一个有效的做法是在controller的方法中添加对应参数如下所示: @RestController public class Test2Contrller { @RequestMapping("/test") public void test(HttpServletRequest req, Htt