Django之視圖(views.py)

一:視圖的做用javascript

二:視圖的url配置css

三:WSGIRequest對象html

四:HttpResponse和JsonResponsejava

五:視圖裝飾器python

六:重定向數據庫

  (1)301重定向django

  (2)302重定向json

七:類視圖瀏覽器

  (1)View()類安全

  (2)TemplateView()類

  (3)ListView()類

  (4)類視圖裝飾器

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1,視圖的做用至關於URL和模板的鏈接器,咱們在瀏覽器中輸入URL,Django經過視圖找到相應的模板,而後返回給瀏覽器。

2,視圖的URL配置過程:在setting中的:ROOT_URLCONF,找到項目中的url.py的配置,而後是APP中的url.py的配置,而後經過必定的匹配規則找到相應的視圖函數

setting:

ROOT_URLCONF = 'lianxi03.urls'

項目url:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path("",include("front.urls",namespace="front"))
]

APP中的url:

from django.urls import path
from front import views
app_name= "front"
urlpatterns=[
    path("",views.index,name="index"),
]

3,HTTP請求中的兩個核心對象:
  HttpRequest:請求對象

  HttpResponse:返回對象

4,WSGIRequest(即視圖函數的第一個參數request)對象和HttpResponse對象:

  一個視圖函數的第一個參數必須是request,而且必須有一個HttpResponseBase對象或者他的子類對象的返回值

  Django在接收到http的請求後,會根據http攜帶的參數和報文信息生成一個WSGIRequest對象,而且做爲視圖函數的第一個參數傳遞給視圖函數(request),

這個對象上包含着客戶端上傳的各類信息,視圖函數處理完相關的邏輯後,也須要返回一個HttpResponseBase對象或者他的子類對象給瀏覽器。用的最多的子類對象就是HttpResponse.

  (1)WSGIResquest對象經常使用的屬性和方法:

  (2)HttpResponse對象經常使用的屬性和方法:

      content:返回的內容

      status_code:返回的http狀態碼

      write():寫入數據到content中

      set_cookie:設置cookie

      delete-cookie:刪除cookie

      content_type:返回數據的MIME類型,默認text/html,瀏覽器器會根據這個來顯示數據經常使用的有:

        text/html:(默認的,HTML文件)

        text/plain:(純文本)

        text/css:(css文件)

        text/javascript:(js文件)

        multipart/form-data:(文件提交)

        application/json:(json傳輸)

        application/xml:(xml文件)

def index(request):
    response = HttpResponse("<h1>我愛python</h1>",content_type="text/plain;charset=utf-8")
    response.status_code = 400
    response["X-Token"] = "python"
    response.content = "悠悠"
    response.write("123")
    return response

  (3)JsonResponse類:

    JsonResponse類繼承自HttpResponse類;用來把對象dump成json字符串,而後將字符串封裝成Response對象返回給瀏覽器。他的content_type爲application/json

persons =[
        {"name":"xiaoming",
         "age":18,
         "sex":0
         },
        {"name": "xiaoming",
         "age": 18,
         "sex": 0
         },
    ]
    return JsonResponse(persons,safe=False)
    # return JsonResponse({"username":"xiaoming","age":15})
    # 默認狀況下只能對字典進行dump,若是是非字典須要傳遞一個參數safe=False

 5視圖裝飾器:

  Django內置了一些裝飾器用來裝飾視圖函數,給視圖函數一些限制,好比這個視圖函數只能經過GET訪問或者其餘方式訪問之類的

  經常使用的有:

  require_http_methods():能夠傳遞一個列表

  require_GET:只能經過get的方法訪問

  require_POST:只能經過POST方式訪問

  require_safe:只能經過安全的方式訪問.(get,head)兩種方式

from django.views.decorators.http import require_http_methods,require_POST,require_GET,require_safe

# @require_http_methods(["GET","POST"])
# @require_GET = @require_http_methods(["GET"])
# @require_POST = @require_http_methods(["POST"])
# @require_safe = = @require_http_methods(["GET","HEAD"])
@require_safe def index(request): if request.method == "GET": return HttpResponse("get") else: return HttpResponse("post")

 6重定向:

  重定向就是當你輸入一個網頁的時候會自動跳轉到另外一個網頁上去,分暫時重定向(301)和永久性重定向(302)

  redirect(to,*args,permanent=False,**kwargs);   參數permanent表示這個重定向是否爲永久重定向,默認爲False

def index(request):                #訪問首頁的時候直接跳轉到電影頁面
    return redirect(reverse("front:move"))

 7類視圖:

  以函數的形式定義的視圖就是函數視圖,這個比較容易理解,當咱們一個函數視圖要處理不一樣的Http請求的時候(post,get等)就須要在函數中寫不一樣的邏輯代碼這樣寫起來就比較麻煩也比較,代碼複用率很低。因此就引入的類視圖。

  經常使用的類視圖有:VIew,TemplateView,ListView

  View類:全部類視圖的基類,都繼承自它。咱們本身定義的類視圖通常也繼承自這個類。

view.py(請求這個類視圖函數的時候,若是是get方法就走get函數,post方法就走post函數,若是方法不在容許範圍內就走最後一個方法)

from django.views.generic import View,ListView,TemplateView
class BaseIndex(View):
    def get(self,request,*args,**kwargs):
        return render(request,"index.html")

    def post(self,request,*args,**kwargs):
        return render(request,"login.html")

    def http_method_not_allowed(self, request, *args, **kwargs):
        return HttpResponse("方法不容許")

url.py(url中,須要加上as_view()方法)

urlpatterns=[
    path("",views.BaseIndex.as_view(),name="index"),
]

  TemplateView類:用來返回一個模板

  經常使用的兩個屬性:template_name 和 get_context_data

class AboutView(TemplateView):
    template_name = "about.html"      #返回這個指定的頁面
    def get_context_data(self, **kwargs):
        context =super().get_context_data(**kwargs)  #調用父類的context方法
        context["username"]="books"    #給這個頁面傳遞參數
        return context

  url.py

urlpatterns=[
    path("about/",views.AboutView.as_view(),name="about"),
]

  ListView類:當咱們須要將數據庫中的一些表展現出來的時候,就會用到這個類,好比文章列表,圖書列表等

model.py

class Books(models.Model):
    name = models.CharField(max_length=12)
    content = models.TextField()
    create_time = models.DateTimeField(auto_now_add=True)

view.py

class BooksView(ListView):                  #繼承自ListView
    model = Books                    #指定這個列表的數據來自哪一個模型
    template_name = "books.html"     #指定這個列表的模板
    paginate_by = 10                  #指定這個列表一頁能夠顯示多少條數據
    context_object_name = "books"    #執行這個列表在模板中的參數名稱
    ordering = "create_time"         #指定這個列表的排序方式
    page_kwarg = "p"               #獲取第幾頁時的參數名稱(默認是page)

    def get_context_data(self, *, object_list=None, **kwargs):                #獲取上下文數據,能夠傳遞模型中沒有的變量
       context = super(BooksView,self).get_context_data(**kwargs)
       return context
       def get_queryset(self):                    #能夠對列表進行刪選(默認是所有列表)
        # return Books.objects.all()
        return Books.objects.filter(id__lte=8)

html.py

<ul>
    {% for book in books %}
       <li>{{ book.name }}</li>
    {% endfor %}
</ul>

   8給類視圖添加裝飾器(給類添加裝飾器有兩種方式:

  第一種:直接裝飾到類上

from django.utils.decorators import method_decorator   #導入裝飾器

def login_required(func):           #定義一個裝飾器
    def wrapper(request,*args,**kwargs):
        if request.GET.get("username"):
            return func(request,*args,**kwargs)
        else:
            return HttpResponse("類裝飾器")
    return wrapper
@method_decorator(login_required,name
="dispatch") #添加裝飾器 class BaseIndex(View): def get(self,request,*args,**kwargs): return render(request,"index.html")

  第二種方式:裝飾到dispatch方法上

from django.utils.decorators import method_decorator

def login_required(func):
    def wrapper(request,*args,**kwargs):
        if request.GET.get("username"):
            return func(request,*args,**kwargs)
        else:
            return HttpResponse("類裝飾器")
    return wrapper

class BaseIndex(View):
    def get(self,request,*args,**kwargs):
        return render(request,"index.html")

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
相關文章
相關標籤/搜索