第一章:Djangoのプロフィール

静的および動的なページ

静的ページ:直接htmlファイルを変更しない限り、データが死んで書かれているが、変更されません

動的なWebページ:データは、例えば、現在の時刻を取得、またはデータベース、データが変更されたデータベースからデータを取得し、動的に取得され、修正されたデータは、動的なWebページを表示します。

Jinja2のモジュール

コードは、データを操作するためのHTMLページのバックエンドでのpythonのように記述することができます(テンプレートの構文)

インストール:pip3 install jinja2

フラスコフレームテンプレートの構文は自動的にJinja2のをダウンロードする枠組みの下で、あなただけのようにフラスコ、Jinja2のモジュールであります

テンプレートの構文はバックエンドに実装され、フロントエンドは認識しません。

テンプレートの構文:

<-- 模板语法(jinja2模板语法非常贴近python语法 但是并不是所有的框架使用的都是jinja模板语法) /-->

写在html文件中 
{{ xxx }}
<p>{{xxx.username}}</p>
<p>{{xxx['password']}}</p>
<p>{{xxx.get('hobby')}}</p>
<p>{{xxx.get('hobby')[0]}}</p>
<p>{{xxx.get('hobby').1}}</p>

for循环:
{%for user_dict in xxx %}
    <tr>
        <td>{{ user_dict.id }}</td>
        <td>{{ user_dict.name }}</td>
        <td>{{ user_dict.hobby }}</td>
    </tr>
{% endfor %}

手書きの簡単なWebフレームワーク

要求処理コード:

import socket

server = socket.socket()
server.bind(('localhost', 8080))
server.listen(5)

"""
请求首行
b'GET / HTTP/1.1\r\n

请求头
Host: 127.0.0.1:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36\r\n
Sec-Fetch-User: ?1\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Sec-Fetch-Site: cross-site\r\n
Sec-Fetch-Mode: navigate\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
空行,代表不再有请求头
\r\n
下面是请求体,因为是get请求,因此请求体无数据
"""

while True:
    conn, addr = server.accept()
    # 将请求体转为字符串格式
    data = conn.recv(1024).decode('utf-8')
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    # 对转换后的数据进行切分(依据空格切分),获取到请求的路径
    target_url = data.split(' ')[1]
    if target_url == '/index':
        conn.send(b'index')
    elif target_url == '/login':
        # 如果路径为/login就返回html文件
        with open('login.html', 'rb') as f:
            conn.send(f.read())
    else:
        # 如果请求页面不存在,返回404响应状态码
        conn.send(b'404 NOT FIND')
    conn.close()

次のようにlogin.htmlとコンテンツファイルの参照は、以下のとおりです。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<p>is login...</p>
</body>
</html>

ベースのwsgireモジュール手書きLiteのWebフレームワーク

私たちは、ブラウザクライアントの要求は数百を持っている場合、パスは、我々は、if文、および対応するデータが返されるのに対応する番号を記入する必要があり、上記のコードを見つけることができますので、貧しい人々スケーラビリティのプログラム、およびすべての決意とリターン1つのファイルにすべてのデータが、外観は散らかっ。

別のファイルに異なる機能分割した後、ユーザーは、対応するリソースを取得できるURLをブラウザウィンドウに入力できます。

ファイルの分割:

urls.py:ルーティングとビュー機能との対応関係

views.py:インサイドビュー解放機能(ビューが機能することができ、また、カテゴリすることができます)

templates文件夹:Templatesフォルダ(店舗内は、htmlファイルの山です)

views.py中代码

def index(env):
    return 'index'


def login(env):
    return 'login'


def error(env):
    return '404 NOT FIND'


import time


# 该函数需要返回一个html页面
def get_time(env):
    current_time = time.strftime('%Y-%m-%d %X')
    with open(r'G:\python项目\day49\templates\02 get_time.html', 'r', encoding='utf-8') as f:
        data = f.read()
    data = data.replace('gfdgsfdgfdsgsfdgsfdgsfdgsdg', current_time)  # 利用字符串的替换
    return data


from jinja2 import Template


def get_user(env):
    user_dict = {'username': 'jason', 'password': 123, 'hobby': ['read', 'study', 'run']}
    with open(r'G:\python项目\day49\templates\03 get_user.html', 'r', encoding='utf-8') as f:
        data = f.read()
    temp = Template(data)
    res = temp.render(xxx=user_dict)
    return res


import pymysql
def get_info(env):
    conn = pymysql.connect(
        host='127.0.0.1',
        port='3306',
        user='root',
        password='123',
        database='day49',
        charset='utf-8',
        autocommit=True
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    sql = "select * from userinfo"
    cursor.execute(sql)
    data = cursor.fetchall()  # 返回的数据是列表套字典
    # 将列表套字典的结构数据 直接传递给html页面
    with open(r'G:\python项目\day49\templates\04 get_info.html', 'rb', encoding='utf-8') as f:
        data = f.read()
    # 利用jinja2模块
    tmp = Template(data)
    # 利用对象的render方法 将数据直接传递给html页面
    res = tmp.render(xxx=data)
    return res

urls.py中代码:

from views import *

urls = [
('/index',index),
    ('/login', login),
    ('/get_time', get_time),
    ('/get_user', get_user),
    ('/get_info', get_info)
]

templates文件夹

三の大PythonのWebフレームワーク

ジャンゴ

利点:大規模で、特に、独自の多成分を運びます

短所:重いです

フラスコ(二つの部分に分け、ソース線600、:リクエストコンテキスト、アプリケーションのコンテキスト)

長所:すべてを追加した場合、小さいながらも少ないが、独自のコンポーネントや機能を運ぶが、サードパーティ製モジュールの特に大きな数がこのフレームワークをサポートすることはジャンゴを越えて行くことができます

短所:フラスコに書き込まれていないサードパーティのモジュール、更新のバージョンフラスコ、サードパーティモジュールは互換フラスコする必要が、そのように、サードパーティのモジュールによって制限され、互換性の問題につながります

竜巻

非同期ノンブロッキング

ナチュラルは、高い同時実行をサポートしています

Djangoのフレームワーク展開準備

Windowsのインストールの注意事項:

  • コンピュータ名は、中国を持つことができません
  • Pythonインタプリタのバージョンが3.7を超えてはならない(3.7バージョンはバグがあります)
  • 推奨1.xのバージョン(1.11.09 - 1.11.13)

あなたは自動的になり、以前のバージョンのアンインストールを手動に必要にわたり続いてきた場合は、再インストールインストールする前にアンインストール

インストールコマンド:

# 在cmd窗口中执行
pip3 install django==1.11.11

# 临时使用其他源安装
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn django==1.11.11

インストールが成功したかどうかをテストします。

# 命令行中输入
django-admin

Djangoプロジェクトを作成する方法

コマンドライン

# 先切换到要创建django项目的目录下
cd project

# 执行创建项目的命令
django-admin startproject mysite # mysite:项目名

# 此时会在项目文件下出现以下文件和目录
D:.
│  manage.py
│
└─mysite
        settings.py
        urls.py
        wsgi.py
        __init__.py

# 启动django项目(先切换到项目目录下)
python manage.py runserver  # django的默认端口号8000
# 此时可以在浏览器中输入ip加端口号访问django
# 例如:http://127.0.0.1:8000/

# 打开的网页提示你创建独立功能的app
# python manage.py startapp [app_label]
python manage.py startapp app01

# 此时会多出来一个app1目录

    目录: D:\mydjango\mysite


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         2020/1/3     19:54                app01
d-----         2020/1/3     19:50                mysite
-a----         2020/1/3     19:50          12288 db.sqlite3
-a----         2020/1/3     19:36            826 manage.py


# cd 到app1中,查看目录
cd app01

# app1中的目录
卷序列号为 0FD0-081A
D:.
│  admin.py
│  apps.py
│  models.py
│  tests.py
│  views.py
│  __init__.py
│
└─migrations
        __init__.py

注意点:

1、Djangoプロジェクトを作成するには、コマンドラインを使用すると、自動的に手動で独自に作成することができますタッチバージョンフォルダテンプレートを作成されていません

2、プロジェクトのDjangoコマンドラインは、設定ファイルのパスを記入していないフォルダのテンプレートを作成するために失敗しただけではなく、自動的に作成さpycharmが追加されます

あなたは完全なパスを記述するためのパスの必要性はなく、htmlファイルへの直接参照、背後にこの操作は、インポートhtmlファイルを実行しない場合

我々は、手動でテンプレートをフォルダを作成しようとしているので:

# 在项目目录下执行,就是和manage.py文件同级的目录
mkdir templates

ディレクトリが作成され、手動で設定ファイルに追加されます。

# settings.py 在项目配置文件中第54行修改
# 修改TEMPLATES中的'DIRS': [os.path.join(BASE_DIR, 'templates')]

私たちは、INSTALLED_APPSの設定に登録されたアプリを作成する必要があります

# 我们创建的app也必须先在这个地方注册之后才能正常执行
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 注册我们自己的app
    # 'app01'  # 简写
    'app01.apps.App01Config'  # 完整写法
]

このとき、ルーティングとurls.pyの関係を考慮して添加することができます

# 这里的urls.py可以使用settings.py目录下的同级urls.py,也可以在我们创建的应用app01下新建urls.py

# 这里我们使用settings.py同级目录下的urls.py
from django.conf.urls import url
from django.contrib import admin
# 导入我们创建的app01中的视图函数文件
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 新增以下的路由和视图的关系
    url(r'^index/', views.index),
    url(r'^login/', views.login),
    url(r'^home/', views.home),
]

views.py行くapp01ディレクトリファイルの下で、我々の見解関数を作成

# 将render,HttpResponse,redirect导入
from django.shortcuts import render, HttpResponse, redirect


# Create your views here.
# 定义的视图函数都必须传入request
def index(request):
    return HttpResponse('你好啊小妹妹')


def login(request):
    return render(request, 'login.html', {'user_dic': {'username': 'json', 'password': 123}, 'mes': 'hello'})


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

login.htmlとファイル

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#取字典中的值#}
{{ user_dic.username }}
</body>
</html>

迅速pycharmを作成します

ファイルの最上部のナビゲーションバー--->新規プロジェクト--->ジャンゴ(仮想環境を使用していない、とDjangoの管理を有効にオフにしないようにしますこちら注)--->を作成--->新しいウィンドウ--->をクリックします。完成

Djangoのsettings.pyファイル

"""
Django settings for mysite project.

Generated by 'django-admin startproject' using Django 1.11.11.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'lb2x()gw&p)10ob6=zky-9_62)fmy#-+m06)kzp8gi+6d*hv18'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition
# 已经安装过的app
# 我们创建的app也必须先在这个地方注册之后才能正常执行
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 注册我们自己的app
    # 'app01'  # 简写
    'app01.apps.App01Config'  # 完整写法
]

# 中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'mysite.urls'

# 模板文件夹配置
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'mysite.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'

使用上の注意ジャンゴを使用して

  • コードは、効果を変更していません
    • 同じポートで複数のサービスまで、サービスを実行してきたことはの始まりです
    • ブラウザのキャッシュの問題
  • Djangoは自動的にそれはあなたのコードに変更を検出するたびに、それは自動的に一定の時間間隔内に再起動されます、時々あなたのコードが終了していないと表示される場合があります再起動し、彼の再起動メカニズムができ、それが自動的に再起動されました。

ジャンゴホワイトは3つのトリックを返します。

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>

リダイレクト

リダイレクト

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

おすすめ

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