パートIV:Djangoのビュー層

ビュー・レイヤーの方法

HttpResponse

文字列を返します。

def index(request):
    return HttpResponse('你好啊小妹妹')

与えます

戻りhtmlページやHTMLページにデータを転送することができます

def login(request):
    return render(request, 'login.html', {'user_dic': {'username': 'json', 'password': 123}, 'mes': 'hello'})
 
# 返回html页面,并可以给html传入字典
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#取字典中的值#}
{{ user_dic.username }}
</body>
</html>
 

の原則をレンダリング

from django.template import Template, Context
def ab_render(request):
    temp = Template('<h3>{{user_dict}}<br>{{user_dict.name}}<br> {{user_dict.password}}</h3>')
    context = Context({'user_dict': {'name': 'jason', 'password': 123}})
    res = temp.render(context)
    return HttpResponse(res)

リダイレクト

リダイレクト

def home(request):
    return redirect('https://www.baidu.com')

JsonResponse

import json from django.http import JsonResponse
def xxx(request):
    user_dict = {'username':'jason好帅哦 我好喜欢!','password':'123'}
    # json_str = json.dumps(user_dict,ensure_ascii=False)
    # return HttpResponse(json_str)
    l = [1,2,3,4,5,6,7,8,9,]
    # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
    return JsonResponse(l,safe=False)  # 序列化非字典格式数据 需要将safe改为False
 
from django.http import JsonResponse
def xxx(request):
    user_dict = {'username':'jason好帅哦 我好喜欢!','password':'123'}
    # json_str = json.dumps(user_dict,ensure_ascii=False)
    # return HttpResponse(json_str)
    l = [1,2,3,4,5,6,7,8,9,]
    # return JsonResponse(user_dict,json_dumps_params={'ensure_ascii':False})
    return JsonResponse(l,safe=False)  # 序列化非字典格式数据 需要将safe改为False

前端と後端のデータ交換

ファイルをアップロードするためのフォームを形成します

action   什么都不写,默认朝当前页面提交数据
 
method   post  什么都不写默认为get请求,不会提交数据,需要改为post
 
enctype  formdata  更改为上传文件

示例:
home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js">    </script>
    <link href="https://cdn.bootcss.com/twitterbootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitterbootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit">
</form>
 
</body>
</html>

views.py

def home(request):
    if request.method == 'POST':
        # 获取用户上传的文件数据
        print(request.FILES)
        file_obj = request.FILES.get('myfile')  # 文件句柄
        print(file_obj.name)  # 获取文件名
 
        # 下面的for循环可以写成django推荐的写法
        # for chunk in file_obj.chunks():
        #       print(chunk)
        with open(file_obj.name,'wb') as f:
            for line in file_obj:
                f.write(line)
 
   return render(request,'home.html')

そして、CBVの機能は、FBVを見ます

FBV:関数ベースのビュー

CBV:クラスベースのビュー

CBV基本的な執筆:

# views.py
from django.views import View
 
 
class MyLogin(View):
    def get(self, request):
        return render(request, 'login.html')
 
    def post(self, request):
        return HttpResponse('我是类里面的POST方法')
 
 
# urls.py
url(r'login/', views.MyLogin.as_view())

北朝鮮が要求を提出するためのログインが自動的にgetメソッド内MyLoginて実行を取得します

POSTリクエストは自動的にPOSTメソッドによるMyLogin内で行わ提出しました

なぜMyLoginは、自動的に別のリクエストメソッドに対応するメソッドを実行することができますか?

画期的なのソースコードを勉強

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

as_viewクラス定義内の正常な機能のいずれかが@staticmethod
いずれかのクラスメソッド定義するクラスに結合されている@classmethod
ビューにポイント。

私たちは、最終的なリターンが我々ので、以下のURL同等の外に、ビューであることがわかりました。

url(r'^login/', views.MyLogin.view)

そして、ビュー機能を行きます:

url(r'^login/', views.MyLogin.dispatch)

戻るMyLoginは、独自のクラスを作成し、この発送方法を見つけるために行くために、クラス継承ビュー、ポイントを参照してください。

読みます:

したがって、この場合は、URLに対応します。

url(r'^login/', views.MyLogin.get)

ソースコードをあなたが見ることができ、すべての文を理解する必要はありませんが、理解することができます参照してください。

CBV源码(******)
    MyClass.as_view()
    # 函数名加括号执行优先级最高
    @classonlymethod
    def as_view(...):
        def view(...):
            ...
        return view
    # 变形
    url(r'^index/',views.view)  # CBV与FBV在路由匹配上本质是一样的
    
    def view(...):
        self = cls(...)  # 生成的是我们自己写的类的对象
        ...
        return self.dispatch(...)
        """
        当你看到self.属性或方法的时候 不要想当然 
        一定要遵循对象的属性和方法的查询顺序
        对象本身  产生对象的类  类的父类
        """
    def dispatch(...):
        # 先判断当前请求方式是否在默认的八个合法请求方式内
        if request.method.lower() in ['get','post','delete','options'...]
            # 利用反射获取对象中对应的属性
            handler = getattr(self,request.method.lower(),报错信息)
        
        return handler(...)  # 执行获取到的方法

Djangoの設定ソース

まずは、Djangoの設定ファイル内で取得してみましょう:

from django.conf import global_settings, settings

global_settingsのファイルは、構成情報の多くを持っている
ユーザーに公開Djangoの設定だけでなく、内部のデフォルト設定をカスタマイズすることができ
ますが、ユーザーを使用するユーザーを設定は、デフォルトの配布を使用する必要はありません
内部に見ることがポイントの設定を:

グローバル大辞典はそうと同等で、最初は空です。

os.environ.get(ENVIRONMENT_VARIABLE)

ENVIRONMENT_VARIABLEへのポイント:

この場合には:

{}.get("DJANGO_SETTINGS_MODULE")

したがって、我々は、我々の観点オープンmanage.pyに大きな辞書セットDJANGO_SETTINGS_MODULEキーを与えた人を見つける必要があります。

したがって:

そして、見下します:

通話設定のカテゴリ、個人用サイトを渡し、農産物オブジェクト、そうでSttingsてクリックします。

from django.conf import global_settings,settings

settings = LazySettings()


class LazySettings(...):
    def _setup(...):
        # 获取暴露给用户的配置文件字符串路径
        setting_module = os.environ.get(纯大写变量名)
        """
        manage.py
        os.environ.setdefault(纯大写变量名,'暴露给用户的配置文件字符串路径')
        """
        
        Settings(setting_module)
def Settings(...)
    # 先遍历全局默认的配置文件       给对象设置键值对
    for setting in dir(global_settings):
        if setting.isupper():
            setattr(self,setting,getattr(global_settings,setting))
            
    
    # 再遍历暴露给用户的配置文件     给对象设置键值对
    md = importlib.import_module(setting_module)
    for setting in dir(md):
        if setting.isupper():
            setattr(self,setting,getattr(md,setting))
    """
    利用的其实就是字典的键存在和不存在 下面语句的作用
    dict[key] = value
    """

おすすめ

転載: www.cnblogs.com/cnhyk/p/12173521.html