第一篇:Django简介

动静态网页

静态网页:数据是写死的,不会变化,除非直接修改html文件

动态网页:数据是动态获取的,例如获取当前时间,或者从数据库中获取数据,当数据库中的数据被修改后,会将被修改的数据动态展示到网页中。

jinja2模块

提供了一个可以在html页面上书写类似于python后端的代码 来操作数据(模板语法)

安装:pip3 install jinja2

flask框架模板语法使用的就是jinja2模块,所以你只要下了flask框架 就会自动下载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模块手写简易版web框架

我们可以发现上面的代码,如果browser客户端请求的路径有上百个,我们就需要写上对应数量的if语句,以及对应的返回数据,这样程序的可扩展性差,且所有的判断和返回的数据都在一个文件中,显得杂乱。

根据功能不同拆分成不同的文件,用户可以在browser窗口中输入url之后可以获取到对应的资源。

文件拆分:

urls.py:路由与视图函数的对应关系

views.py:里面放视图函数(视图函数可以是函数也可以是类)

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框架

Django

优点:大而全,自身携带的组件特别多

缺点:笨重

flask(源码600多行,分为两部分:请求上下文,应用上下文)

优点:小而精,自身携带的组件和功能少,但第三方支持该框架的模块特别多,如果全部叠加起来可以超越django

缺点:第三方模块不是flask写的,随着flask的版本更新,第三方模块需要去兼容flask,会引发兼容性问题,因此受限于第三方模块

tornado

异步非阻塞

天然支持高并发

Django框架部署准备

windows安装注意事项:

  • 计算机名称不能有中文
  • python解释器的版本不能超过3.7(3.7的版本有bug)
  • 推荐使用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项目是不会自动创建templates摸版本文件夹 你只能自己手动创建

2、命令行创建的django项目不但没有templates文件夹配置文件中也没有填写路径,而pycharm创建的会自动添加

如果不做这步操作,后面导入html文件时,路径需要写全路径,无法直接引用html文件

因此我们要去手动创建templates文件夹:

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

手动将创建的目录添加到配置文件中:

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

需要将创建的app在settings中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),
]

再去app01目录下views.py文件中,创建我们的视图函数

# 将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快速创建

点击导航条上方的File ---> New Project ---> Django(此处注意不要使用虚拟环境,也不要取消勾选Enable Django admin) ---> Create ---> New Window ---> 完成

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使用时注意点

  • 代码修改了始终没有效果

    • 在同一个端口下起来多个服务,一直跑的是最开始的那个服务
    • 浏览器缓存问题
  • django能够自动重启,但是他的重启机制只要检测到你的代码有变化,在一定时间间隔内就会自动重启,所以有时候可能会出现你的代码还没写完,就已经自动重启了。

django小白必回三板斧

HttpResponse

返回的是字符串

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

render

返回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>

redirect

重定向

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

原文地址:https://www.cnblogs.com/cnhyk/p/12147076.html

时间: 2024-10-14 02:39:26

第一篇:Django简介的相关文章

python学习之旅【第一篇】简介和入门

python简介: 一.什么是python pythonde 设计哲学是:“优雅”.“明确”.“简单” 二.python由来  1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.之所以选中Python作为程序的名字,是因为他是BBC电视剧——蒙提·派森的飞行马戏团(Monty Python‘s Flying Circus)的爱好者. 三.Python能做什么 Web程序 Python经常被用于Web开发.比如,通过mod_ws

第一课~Django~简介

Django一个可以是Web开发工作者开发工作愉快并且高效的Web 框架 . 使用Django , 使你能够以最小的代建构建和维护高质量的Web应用 . 从好的方面来看 , Web开发激动人心并且富有创造性 ; 从另一方面来看它却是繁琐而令人厌恶的工作 . 通过减少代码的重复开发 , Django使你能够专注于Web工作中有趣并且关键的东西 . 为了能够达到这个目标 , Django提供了通用的Web开发模式的高度抽象 , 提供了频繁进行编程开发的快速解决办法 , 以及 "如何解决问题"

【DirectX11】第一篇 DirectX11简介

本系列主要翻译和参考<Real-Time 3D Rendering with DirectX and HLSL>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是书中的代码和资源. 关于DirectX DirectX是一系列用来在微软提供的众多平台上开发游戏或图形应用的API接口,这些平台包括有Windows,Windows Phone,Xbox360以及最新的Xbox One.从上世纪末开始,DirectX已经发展并一直作为现代图形编程领域的领导者之一存在.DirectX3D作为D

JavaMail入门第一篇 邮件简介及API概述

现如今,电子邮件在我们的生活当中扮演着越来越重要的角色,我们每个人几乎都会与其打交道(至少时不时我们都会接收到莫名其妙的垃圾邮件),在工作中,使用邮件进行交流沟通,可以使我们的工作有迹可循,也显的较为正式,这是由我们人为手工操作的,在生活中,在某网站注册了一个账户之后,该网站就会自动发送一封欢迎邮件并让我们确认是否注册,以防止恶意注册,当然,这个就不可能像我们工作中手工方式来进行操作了,Java的13种核心技术中的JavaMail为我们提供了API来对邮件进行相关的操作. 一.邮件服务器 要在I

Python Web框架【Django框架第一篇基础】

Django框架第一篇基础[DjangoMTV模式] 老师博客[www.cnblogs.com/yuanchenqi/articles/6811632.html] 同学博客:http://www.cnblogs.com/haiyan123/p/7701412.html Django官网:https://www.djangoproject.com/download/ 一.安装Django DjangoMTV模式 Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代

【ABAP系列】SAP ABAP7.40新语法简介第一篇

公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简介第一篇 前言部分 大家可以关注我的公众号,公众号里的排版更好,阅读更舒适. 正文部分 SAP的系统不断的更新 7.40已经出来很久了,一直忙着没有更新7.40新语法内容 慢慢写点新语法的相关内容 首先说一下7.40的特点及简介 1.ABAP 7.40是AS ABAP 7.31(也称为ABAP 7.

Django基础第一篇

目录 1.Django MTV框架简介 2.基础命令创建项目的配置说明 3.前后端交互案例 4.基于数据库实现数据交互增删改查 Django简介 Django框架的设计模式借鉴了MVC的思想,和MVC不同的点是它拆分的三部分,分别为:(Model)模型. (Template)模板.以及(View)视图 MVC和MTV知识点补充: MVC是三个单词的首字母缩写,它们是Model模型.View视图 和Controller控制. 1)最上面的一层,是直接面向最终用户的"视图层"(View).

第一篇 Replication:复制简介

本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication describes the process of reproducing or duplicating.Replication in SQL Server does exactly that;it reproduces or duplicates data.任何时候,你需要创建一个数据的副本,或重现该数据的变化,复

Django Web开发【1】Django简介

前言 看完<Django Book>之后, 总想找个实例来实战开发下,无奈国内Django的书籍相当少,只能从英文书籍中吸取养料,偶然之后得到Learning Website Development with Django这本书,感觉挺不错,虽然想着翻译,但是自身时间实在太少,只能简略的挑重点翻译下了. 原书08年的时候就出版了,所以它使用的Django版本比较低,由于自身工作的环境使用的是Django1.3.5,所以迁移过来有些代码变化也比较大. 这是我的第一篇原创博客(翻译也算不上吧),希

Django搭建简易博客教程(01)-Django简介

a-terminal: 写作目的 喜欢一个学习观点以教促学, 一直以来, 学习的时候经常会发现, 某个方法某个问题自己已经明白了, 但是在教给别人的时候确说不清楚, 所以慢慢的学会了以教促学这种方法, 在教给别人知识的同时也能够提升自己对语言, 对框架的理解. 希望达到的目标: 希望能写出一个系列文章, 我也不知道到底能写多少 能够让认真阅读这个系列的文章的人, 能在读完之后做出一个简单的博客 希望能够加深自己对Django的理解 Django简介 Django是Python中目前风靡的Web