python-djangoフロントエンドでデータを転送する3つのフォーマット_CBVソース分析_djangoテンプレート構文

60785 ワード

django
1.CBVソース分析
#   :            bug    

# urls.py
url(r'^login/',views.MyLogin.as_view())

'''
CBV FBV                          

ps:    /               

as_view()   @classmethod      
	
	@classonlymethod
    def as_view(cls, **initkwargs):
    	...
        return view
'''
# as_view    
@classonlymethod
def as_view(cls, **initkwargs):
    """
    cls         
    Main entry point for a request-response process.
    """
    def view(request, *args, **kwargs):
        self = cls(**initkwargs)  # cls        
        # self = MyLogin(**initkwargs)                
        return self.dispatch(request, *args, **kwargs)
    """
	            
               
                   
               
    	...
      :         self                 self    
    """
    return view

# CBV   
1.     ,         path('index/', views.Index.as_view()),
     views.Index.as_view()(request)
2.      as_view()        view(request)
3.    view(request) => dispatch(request)
4. dispatch  ,       (get,post)=>         def get  def post
# views.py

class Index(View):
    #          
    # http_method_names = ['post', 'get']

    def dispatch(self, request, *args, **kwargs):

        #      dispatch
        #       
        #    
        # res=super().dispatch(request, *args, **kwargs)
        # #    
        # return res

        #        ,   get
        return self.get(request, *args, **kwargs)

    #   dispatch  ,   ,         
    def get(self, request, *args, **kwargs):
        print(request.data)
        return HttpResponse('cbv get  ')

    def post(self, request, *args, **kwargs):
        return HttpResponse('cbv post  ')

2.前後端交互符号化方式
1. urlencoded =>       (form    )  request.POST
2. form-data  =>                      request.POST   request.FILES
3. json       =>  json                 request.body        

def index(request):
    #   urlencoded  
    body  :name=lqz&age=18
    # print(request.POST)

    #   form-data  
    body  :    ,      ,      
        :name=lqz&age=18
    ---asdfasdfasdfgasgasgd---
        :(   )
    
    #     
    # print(request.POST)
    #     
    # print(request.FILES)

    #   json  
    body   
    {
     
    "name": "lqz",
    "age": 18
	}
    #     
    print(request.POST)
    #     (    )
    print(request.body)

    return HttpResponse('ok')

3.djangoテンプレート構文
1.djangoテンプレートの使い方
#       :

    :{
     {
          }}
    
    1          
    2    

    :{
      %   % }

views.py
from django.template import Template,Context

def index(request):

    #      ,    
    now = datetime.datetime.now()
    return render(request,'time.html',context={
     'current_date':str(now),'title':'lqzNB'})
    
    #      
    now=datetime.datetime.now()
    # t = Template('     :

{ {current_date}}

')
from day65 import settings import os path=os.path.join(settings.BASE_DIR,'templates','time.html') print(path) ss=open(path,'r',encoding='utf-8').read() t=Template(ss) # t=get_template('current_datetime.html') c=Context({ 'current_date':str(now),'title':'lqzNB'}) html=t.render(c) # html # render(request,'home.html',context={'current_date':str(now)}) return HttpResponse(html)

time.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{
    { title }}title>
head>
<body>
     :<h1>{
    { current_date }}h1>
body>
html>

2.テンプレート構文の変数
​ DTL: Django Template Language
Djangoテンプレートにおける複雑なデータ構造の遍歴の鍵は句点文字であり,構文:{変数名}}
views.py
      {
     {
      python   }}

def index(request):
    num = 10
    ss = 'lqz is handsome'
    b = False
    ll = [1, 2, 43]
    dic = {
     'name': 'lqz', 'age': 18}

    def test():
        print('  test')
        return 'test ---    '

    class Person():
        def __init__(self, name):
            self.name = name

        def print_name(self):
            return self.name
        def __str__(self):
            return self.name

    p=Person('lqz')

    # return render(request, 'index.html',{'num':num,'ss':ss,'b':b})
    # locals()             ,   context 
    return render(request, 'index.html',locals())

index.html
# index.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{
    {ss}}title>
head>
<body>

<h1>       h1>

<p>  :{
    { num }}p>
<p>   :{
    { ss }}p>
<p>  :{
    { b }}p>
<p>  :{
    { ll }}p>
<p>  :{
    { dic }}p>
<p>  :{
    { test }}p>
<p>  :{
    { p }}p>

body>
html>

3.テンプレート構文の深さクエリー句点
views.py
def index(request):
    num = 10
    ss = 'lqz is handsome'
    b = False
    ll = [1, 2, 43, {
     'name': 'egon'}]
    dic = {
     'name': 'lqz', 'age': 18}

    def test():
        print('  test')
        return 'test ---    '

    class Person():
        def __init__(self, name):
            self.name = name

        def print_name(self):
            return self.name

        def __str__(self):
            return self.name

    p = Person('lqz')

    link1 = ' を け'
    link2 = mark_safe(link1)

    input_1='

'
input_2=mark_safe(input_1) script_1=''' alert(' ') ''' script_2 =mark_safe(script_1) return render(request, 'index.html', locals())

index.html
<h2>             h2>
<p>        :{
    { ll.0 }}p>
<p>   name    :{
    { dic.name }}p>
<p>         name    :{
    { ll.2.name }}p>
<p>    ,        :{
    { test }}p>
<p>p>
<p>      : {
    { p.print_name }}p>
<p>      : {
    { p.name }}p>
<hr>
<a href="https://www.baidu.com">  a>
<p>a      : {
    { link1 }}p>
<p>a      ,   a  : {
    { link2 }}p>

<p><input type="text" name="name">p>
<p>input  :{
    { input_1 }}p>
<p>input  ,     :{
    { input_2 }}p>

<p>js      :{
    { script_1 }}p>
{
    { script_2 }}

#   
from django.utils.safestring import mark_safe

link1 = '<a href="https://www.baidu.com">  <a>'
link2 = mark_safe(link1)

{link1|safe}

4.テンプレートフィルタ
​ default,length,filesizeformat,date,slice,truncatechars,safe
index.html
1. {
    {   1|     :   2 }}
2.          ,       {
    { 'lqz is'|slice: '2:3' }}

<h1>   h1>

<p>    default:{
    { num|default:'   ' }}p>
<p>    length:{
    { ll|length }}p>
<p>    length:{
    { dic|length }}p>
<p>    length:{
    { 'das'|length }}p>

{#           #}

#   
<p>    filesizeformat:{
    { num|filesizeformat }}p>

# lqz is handsome
<p>    slice:{
    { ss|slice:"7:11" }}p>

#       0,1,2,    ...,     3  
<p>    truncatechars:{
    { ss|truncatechars:'30' }}p>
<p>truncatewords:{
    { ss|truncatewords:'2' }}p>

#   
<p>    date:{
    { ctime|date:'Y m d -------H i s ' }}p>
<p>    safe:{
    { link1|safe }}p>

5.テンプレートラベル
​ for,for … empty,if,with,csrf_token
タグ構文:{%tag%}
ラベルは変数より複雑です.
一部は出力にテキストを作成し、一部はループまたは論理によってプロセスを制御し、一部はその後の変数が使用する追加情報をテンプレートにロードします.一部のラベルには、開始ラベルと終了ラベル(例えば、{%tag%}...ラベル内容...{%endtag%})が必要です.
forラベル
各要素を巡回:
{% for person in person_list %}
    <p>{
    { person.name }}p>
{% endfor %}
{% for obj in list reversed %}を使用してループを逆方向に完了できます
辞書を1つ巡ります.
{% for key,val in dic.items %}
    <p>{
    { key }}:{
    { val }}p>
{% endfor %}

注:サイクル番号は{forloop}で表示できます
forloop.counter            
	The current iteration of the loop (1-indexed)         ( 1  )
	
forloop.counter0           
	The current iteration of the loop (0-indexed)         ( 0  )
	
forloop.revcounter         
	The number of iterations from the end of the loop (1-indexed)           ( 1  )
	
forloop.revcounter0        
	The number of iterations from the end of the loop (0-indexed)           ( 0  )
	
forloop.first              
	True if this is the first time through the loop             (   )
	
forloop.last               
	True if this is the last time through the loop              (   )
	
forloop.parentloop         
	         

for … empty
forラベルには、与えられたグループが空であるか、見つからない場合に操作できるように、オプションの{%empty%}従文が付いています.
{% for person in person_list %}
    <p>{
    { person.name }}p>

{% empty %}
    <p>sorry,no person herep>
{% endfor %}

ifラベル
{%if%}は変数を評価し、その値が「True」(存在、空ではなくbooleanタイプのfalse値ではない)の場合、対応するコンテンツブロックが出力されます.
{% if num > 100 or num < 0 %}
    <p>  p>
{% elif num > 80 and num < 100 %}
    <p>  p>
{% else %}
    <p>   p>
{% endif %}

if文はand,or,=,>,=,in,not in,is,is not判断をサポートする.
withラベル
単純な名前で複雑な変数をキャッシュする
データベースへのアクセスなど、「高価」な方法を何度も使用する必要がある場合に便利です.
{% with total=business.employees.count %}
    {
    { total }} employee{
    { total|pluralize }}
{% endwith %}

csrf_tokenラベル
​ {% csrf_token%}
このラベルは、サイト間で偽造保護を要求するために使用されます.
views.py
# views.py
def index(request):
    ll=['lqz','egon','zs','ls','ww']
    # ll=[]
    dic={
     'name':'lqz','age':19}
    count=1

    lqzisnbplus='lqz'
    # b=False
    b=True
    user_list=[{
     'name':'lqz','age':19},{
     'name':'egon','age':18},{
     'name':'  ','age':22},{
     'name':'  ','age':99},{
     'name':'asdfasdf','age':18},{
     'name':'    n','age':18}]
    return render(request, 'index.html', locals())

index.html
<h1>       h1>

<h2>for   h2>
{% for l in ll %}
    {# <p>{
    { l }}p> #}
    <p><a href="http://127.0.0.1:8080/{
      { l }}">{
    { l }}a>p>
{% endfor %}

<hr>
{% for k,v in dic.items %}
    <p>key  :{
    { k }},value  {
    { v }}p>
{% endfor %}

<table border="1">
    <tr>
        <td>id td>
        <td>   td>
        <td>  td>
    tr>
    {% for dic in user_list %}
        <tr>
            <td>{
    { forloop.counter }}td>
            <td>{
    { dic.name }}td>
            <td>{
    { dic.age }}td>
        tr>
    {% endfor %}
table>

<h2>for...empty   h2>
<ul>
    {% for l in ll %}
        <li>{
    { l }}li>
    {% empty %}
        <li>    li>
    {% endfor %}
ul>

<h2>forloop  h2>
{% for dic in user_list %}
    {% for key,value in dic.items %}
        {
    { forloop.parentloop.counter }}
        <p>{
    { key }}:{
    { value }}p>
    {% endfor %}
{% endfor %}

<h2>ifh2>
{% if b %}
    <p>b true p>
{% else %}
    <p>b false p>
{% endif %}

<h2>with   h2>
{% with forloop.parentloop.counter as aaa %}
    {
    { aaa }}
{% endwith %}

{% with lqzisnbplus as a %}
{
    { a }}
{
    { lqzisnbplus }}
{% endwith %}

<h2>csrfh2>
{% csrf_token %}
<input type="text" name="csrfmiddlewaretoken" value="uC35XuP1J2Va74ArYiNw4TMZ0PaZ6V4qvVGCsUQcqiKF5Sr8IrWS0rzpmOmPBrjY">
body>