官术网_书友最值得收藏!

Views got classier

Class-based views were introduced in Django 1.4. Here is how the previous view looks when rewritten to be a functionally equivalent class-based view:

from django.views.generic import View 
 
 
class HelloView(View): 
    def get(self, request, name="World"): 
        return HttpResponse("Hello {}!".format(name)) 

Again, the corresponding URLConf would have two lines, as shown in the following commands:

# In urls.py 
    path('hello-cl/<str:name>/', views.HelloView.as_view()), 
    path('hello-cl/', views.HelloView.as_view()),

There are several interesting differences between this View class and our earlier view function. The most obvious one being that we need to define a class. Next, we explicitly define that we will handle only the GET requests. The previous view function gives the same response for GET, POST, or any other HTTP verb, as shown in the following commands using the test client in a Django shell:

>>> from django.test import Client
>>> c = Client()

>>> c.get("http://0.0.0.0:8000/hello-fn/").content
b'Hello World!'

>>> c.post("http://0.0.0.0:8000/hello-fn/").content
b'Hello World!'

>>> c.get("http://0.0.0.0:8000/hello-cl/").content
b'Hello World!'

>>> c.post("http://0.0.0.0:8000/hello-cl/").content
Method Not Allowed (POST): /hello-cl/
b''

Notice that the POST method is disallowed rather than being silently ignored. Being explicit is good from a security and maintainability point of view.

The biggest advantage of using a class will be clear when you need to customize your view. Say you need to change the greeting and the default name. Then, you can write a general View class for any kind of greeting and derive your specific greeting classes as follows:

class GreetView(View): 
    greeting = "Hello {}!" 
    default_name = "World" 
    def get(self, request, **kwargs): 
        name = kwargs.pop("name", self.default_name) 
        return HttpResponse(self.greeting.format(name)) 
 
class SuperVillainView(GreetView): 
    greeting = "We are the future, {}. Not them. " 
    default_name = "my friend" 

Now, the URLConf would refer to the derived class:

# In urls.py 
    path('hello-su/<str:name>/', views.SuperVillainView.as_view()), 
    path('hello-su/', views.SuperVillainView.as_view()),     

While it is not impossible to customize the view function in a similar manner, you would need to add several keyword arguments with default values. This can quickly get unmanageable. This is exactly why generic views migrated from view functions to class-based views.

Django Unchained

After spending two weeks hunting for good Django developers, Steve started to think out of the box. Noticing the tremendous success of their recent hackathon, he and Hart organized a Django Unchained contest at S.H.I.M. The rules were simple: build one web application a day. It can be a simple one, but you cannot skip a day or break the chain. Whoever creates the longest chain, wins.

The winner, Brad Zanni, was a real surprise. Being a traditional designer with hardly any programming background, he had once attended a week-long Django training just for kicks. He managed to create an unbroken chain of 21 Django sites, mostly from scratch.

The very next day, Steve scheduled a 10 o'clock meeting with him at his office. Though Brad didn't know it, it was going to be his recruitment interview. At the scheduled time, there was a soft knock and a lean, bearded guy in his late twenties stepped in. As they talked, Brad made no pretense of the fact that he was not a programmer. In fact, there was no pretense to him at all. Peering through his thick-rimmed glasses with calm blue eyes, he explained that his secret was quite simple—get inspired and then focus.

He used to start each day with a simple wireframe. He would then create an empty Django project with a Twitter bootstrap template. He found Django's generic class-based views a great way to create views with hardly any code. Sometimes, he would use a mixin or two from Django-braces. He also loved the admin interface for adding data on the go.

His favorite project was Labyrinth — a Honeypot disguised as a baseball forum. He even managed to trap a few surveillance bots hunting for vulnerable sites. When Steve explained about the SuperBook project, he was more than happy to accept the offer. The idea of creating an interstellar social network truly fascinated him.

With a little more digging around, Steve was able to find half a dozen more interesting profiles like Brad within S.H.I.M. He 
learned that rather than looking outside he should have searched within the organization in the first place.

主站蜘蛛池模板: 南和县| 五家渠市| 镶黄旗| 织金县| 诸暨市| 格尔木市| 万安县| 曲麻莱县| 禹城市| 南丹县| 共和县| 屏东县| 西安市| 双江| 鄂托克前旗| 珠海市| 布尔津县| 漠河县| 固安县| 五指山市| 年辖:市辖区| 拜城县| 邵阳市| 台北县| 龙陵县| 新龙县| 四平市| 璧山县| 宁河县| 灯塔市| 渑池县| 绥江县| 修文县| 孙吴县| 炉霍县| 延长县| 高雄市| 宁远县| 金堂县| 彩票| 扎鲁特旗|