Django基础(2)_jinja2_MTV_创建django项目

模板渲染jinja2

jinja2实现了模板渲染的功能,django中自带了模板渲染的功能但是不能为别的框架使用

我们完全可以从数据库中查询数据,然后去替换我html中的对应内容(专业名词叫做模板渲染,你先渲染一下,再给浏览器进行渲染),然后再发送给浏览器完成渲染。 这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2  

下载:

pip intall jinja2

 

来一个html文件,index2,html,内容如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
</head>
<body>
    <h1>姓名:{{name}}</h1>
    <h1>爱好:</h1>
    <ul>
        {% for hobby in hobby_list %}
        <li>{{hobby}}</li>
        {% endfor %}
    </ul>
</body>
</html>

 

使用jinja2渲染index2.html文件,创建一个python文件,代码如下:

from wsgiref.simple_server import make_server
from jinja2 import Template


def index():
    with open("index2.html", "r",encoding='utf-8') as f:
        data = f.read()
    template = Template(data)  # 生成模板文件
    ret = template.render({"name": "于谦", "hobby_list": ["烫头", "泡吧"]})  # 把数据填充到模板里面
    return [bytes(ret, encoding="utf8"), ]


# 定义一个url和函数的对应关系
URL_LIST = [
    ("/index/", index),
]

def run_server(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息
    url = environ['PATH_INFO']  # 取到用户输入的url
    func = None  # 将要执行的函数
    for i in URL_LIST:
        if i[0] == url:
            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数
            break
    if func:  # 如果能找到要执行的函数
        return func()  # 返回函数的执行结果
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]


if __name__ == '__main__':
    httpd = make_server('', 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()
View Code

 

  现在的数据是我们自己手写的,那可不可以从数据库中查询数据,来填充页面呢?

  使用pymysql连接数据库:

import pymysql

conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select name, age, department_id from userinfo")
user_list = cursor.fetchall()
cursor.close()
conn.close()

  创建一个测试的user表:

CREATE TABLE user(
  id int auto_increment PRIMARY KEY,
  name CHAR(10) NOT NULL,
  hobby CHAR(20) NOT NULL
)engine=innodb DEFAULT charset=UTF8;

   模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法规则写上,其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容。

Django

 

Django简介及简单使用

 

Django是一个开放的源代码的web应用框架, 由python写成, 使用了 MTV框架

 

 Python的Web框架有上百个,比它的关键字还要多。所谓Web框架,就是用于开发Web服务器端应用的基础设施(通常指封装好的模块和一系列的工具)。Python的Web框架中比较有名的有:Flask、Django、Tornado、Sanic、Pyramid、Bottle、Web2py、web.py等。在基于Python的Web框架中,Django是所有重量级选手中最有代表性的一位,开发者可以基于Django快速的开发可靠的Web应用程序,因为它减少了Web开发中不必要的开销,对常用的设计和开发模式进行了封装,并对MVC架构提供了支持(MTV)。

MVC和MTV模型

MVC模型

所谓MVC就是把Web应用分为模型(M)、 控制器(C)和 视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

 

 

 

 

 

MTV模型

 

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是指:

 

  • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
  • T 代表模板 (Template):负责如何把页面展示给用户(html)。
  • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。

 

除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

 

 

 

好了现在正式开始介绍我们的Django

创建Django项目

1. 命令行创建

django-admin startproject demo  # 创建一个名为demo的项目

 

2. pycharm创建

manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。
mysite/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
mysite/settings.py:Django 项目的配置文件。
mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。
mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。

 

  • 修改项目的配置文件settings.py

  Django是一个支持国际化和本地化的框架,因此刚才我们看到的默认首页也是支持国际化的,我们将默认语言修改为中文,时区设置为东八区。

# 设置语言代码
LANGUAGE_CODE = 'zh-hans'
# 设置时区
TIME_ZONE = 'Asia/Beijing'

 

  • 创建APP
python manage.py startapp app01

 

 

  • pycharm创建app

创建项目时,在app name输入APP的名称,就可以创建APP了.

注意: 通过pycharm创建的,不用自己在settings里配置,但是,通过命令行的,一定手动,进行配置,否则,应用无法生效.

 

 

 .

1 migrations:存放与模型有关的数据库迁移信息。
2 migrations/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
3 __init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
4 admin.py:可以用来注册模型,用于在Django的管理界面管理模型。
5 apps.py:当前应用的配置。
6 models.py:存放应用的数据模型,即实体类及其之间的关系(MVC/MVT中的M)。
7 tests.py:包含测试应用各项功能的测试类和测试函数。
8 views.py:处理请求并返回响应的函数(MVC中的C,MVT中的V)。
  • 注册APP

  在settings.py里的INSTALLED_APPS列表中,添加注册app。
  有两种方法:

    • INSTALLED_APPS = [..., "app01', ...]
    • INSTALLED_APPS = [..., "app01.apps.App01Config', ...] # 推荐这种写法

启动Django项目

  • 命令行

 

python3 manage.py runserver      # 127.0.0.1:8000
python manage.py runserver 80             # 127.0.0.1:80
python manage.py runserver 0.0.0.0:8888   # 0.0.0.0:8888# 注意:要在manage.py同级目录执行命令
  • pycharm 启动
    点击右上角的绿色的三角按钮.
    如需更改配置信息,请下拉选择edit,进行配置.
  • 使用manage.py文件启动

   配置manage.py文件启动如下

 

 基于Django实现一个简单的登陆验证实例

虽然特别low,凑合着看吧

 

 

 

 

 

 

  •  settings.py

首先在settings文件中注册我们的app 另外由于这里我们提交了一个post请求,所以django

中间件中的csrf验证我们先注释了,这个我们以后再说

"""
Django settings for demo project.

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

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 = '8&7$-!$kq)-b(pa2$$$p%edeue*f*(yb^5svik%1uu@liiq%w^'

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

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    '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 = 'demo.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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 = 'demo.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/'
settings.py
  • demo中的urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('', views.index),
]
urls.py
  • views.py     

这里面写我们的视图函数

from django.shortcuts import render,HttpResponse

# Create your views here.


def index(request):
    name = request.POST.get('username')
    pwd = request.POST.get('password')
    if name == 'root' and pwd == '123':
        return render(request, 'home.html')
    return render(request, 'index.html')

 

  • index.html   
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <!---->
</head>
<body>

<form action="" method="post">
    <input type="text" name="username" >
    <input type="password" name="password">
    <button>登录</button>
</form>

</body>
</html>
  • home.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <!---->
</head>
<body>
<h1>hello come\\</h1>
</body>
<script src='jquery.js'></script>
</html>

 

 

接下来运行我们的项目,大家来看

 

 

当我们输入正确的用户名和密码后,look->  就跳转到了我们的home页面

 

posted @ 2020-11-21 14:33  死里学  阅读(91)  评论(0)    收藏  举报