Django入门

一、MVC与MTV模型

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

'''
Django的MTV模式本质上和MVC是一样的,也是为了各组件保持松耦合关系,只是定义上有些不同,Django的MTV分别是:
    M  代表模型(Model)      负责业务对象和数据库的关系映射
    T  代表模板(Template)   负责如何把页面展示给用户html
    V  代表视图(View)       负责业务逻辑,并在适当的时候调用Model和Template
    出了以上三层外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
    
'''

二、Django的安装与使用

 1、安装Django

'''
方式1:
    在命令行输入:pip3 install django   # 默认是安装最新版本
    也可指定版本号:pip install django==1.11.9 -i http://mirrors.aliyun.com/pypi/simple/  --trusted-host mirrors.aliyun.com  
方式1:
    pycharm方式安装:
方式3:
    pycharm的Terminal里安装: pip3 install django
'''

2、创建一个Django项目

'''
方式1:
    在指定目录下运行命令:django-admin.exe startproject 项目名字
    
方式2:
    pycharm下创建:file-->new project-->django---
    
方式3:
    pycharm的terminal下:django-admin.exe startproject 项目名字

'''

3、创建APP

python3 manage.py startapp app的名字

4、启动Django项目

'''
python3 manage.py runserver 127.0.0.1:8007   #指定IP和端口
python3 manage.py runserver 8007      #指定端口
python3 manage.py runserver       #不指定IP和端口 默认是127.0.0.1:随机端口

pycharm启动
'''

浏览器中访问,出现以下界面则Django项目启动成功

 三、基于Django实现一个简单的示例

1、url控制器

from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import render
from myweb.app01 import views

urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url('^test',views.test),
    url(r'^classes/',views.classes),
    url(r'^student/',views.students),
    url(r'^add_student/',views.add_student),
]

2、视图

from django.shortcuts import render, redirect
from myweb.app01.models import MyModel
import pymysql


def test(request):
    '''
    :param request:  包含了请求体中的所有信息
    :return:
    '''
    name = 'chunke_li'
    personal = ['chunke_li', 20, 'sa']
    mypersonal={'name':'chunke_li','age':20}
    # 获取字典列表的值  pymysql返回就是这种形式 最常用****
    dicinfo=[{'id': 1, 'name': 'chunke_li', 'classId': 1}, {'id': 2, 'name': '李春科', 'classId': 3}]

    return render(request, 'test.html', {'name': name, 'personal': personal,'mypersonal':mypersonal,'dicinfo':dicinfo})

3、模板

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>模板语言</title>
    <script src="/static/js/jquery.min.js"></script>
</head>
<body>
    <h1>获取字符串的值</h1>
        {{ name }}
    <h2>获取列表的值</h2>
        <h3> {{ personal }}</h3>
        <h3> {{ personal.0 }}</h3>
        <h3> {{ personal.1 }}</h3>
        <h3> {{ personal.2 }}</h3>
    <h2>获取字典的值</h2>
        <h3>{{ mypersonal }}</h3>
        <h3>{{ mypersonal.name }}</h3>
        <h3>{{ mypersonal.age }}</h3>
    <h2>获取字典列表的值</h2>
        <table border="1px">
            <!--设置表头-->
            <tr>
                <!--表格中的表头有th创建-->
                <th>id</th>
                <th>name</th>
                <th>classId</th>
            </tr>

            <!--使用for循环将字典列表的值插入到表格里-->
            {% for item in dicinfo  %}
                <tr>
                    <!--表格中的数据由td创建-->
                    <td>{{ item.id }}</td>
                    <td>{{ item.name }}</td>
                    <td>{{ item.classId }}</td>
                </tr>
                <!--tr定义html中表格的行-->
            {% endfor %}
        </table>
</body>
</html>

浏览器访问:

 

 

 

四、静态资源的配置

1、settings.py里配置静态文路由:STATIC_URL = '/static/'     # 指定静态文件路由   一般不要改 

2、项目根目录下创建static目录   # 存放静态文件(图片、css、js等)

3、settings.py里配置静态文件目录
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),   # 可以配置多个目录
)

 五、template文件路径的配置

1、创建template目录     
2、settings.py里注册
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',
            ],
        },
    },
]

 六、app的创建及配置

1、创建app   python3 manage.py startapp app01  
2 在settings.py里注册 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01' ]

七、简单的登录认证功能

from django.shortcuts import render, HttpResponse
import pymysql

# Create your views here.


config = {
    'host': '127.0.0.1',
    'user': 'fred_li',
    'passwd': '835y1354',
    'db': 'game'
}


def conn_mysql(sql, args):
    try:
        con = pymysql.connect(**config)
        cur = con.cursor(cursor=pymysql.cursors.DictCursor)
    except Exception as e:
        return ('connection db error', e)

    cur.execute(sql, args)
    res = cur.fetchone()
    return res


def login(requests):
    if requests.method == 'GET':
        return render(requests, 'login.html')
    elif requests.method == 'POST':
        name = requests.POST.get('name')
        pwd = requests.POST.get('pwd')
        # <QueryDict: {'name': ['11'], 'pwd': ['1111111']}> <class 'django.http.request.QueryDict'>
        if name and pwd:
            sql = 'select * from account where name=%s and passwd=%s'
            args = (name, pwd)
            res = conn_mysql(sql, args)
            if res:

                return HttpResponse('登录成功')
            else:
                return HttpResponse('用户名或密码错误')
        else:
            return HttpResponse('用户名或密码不能为空')
views.py
# request.method  ----前台提交过来请求的方式
# request.POST(相当于字典QueryDict)----post形式提交过来的数据,(http请求报文的请求体中)
# request.POST.get('name') ----推荐用get取值(取出列表最后一个值)
# request.POST.getlist('name')-----取出列表所有的值_
# 前台get方式提交的数据,从request.GET字典里取
# 连接数据库,推荐以下写法(sql,args),防止sql注入
    sql = 'select * from account where name=%s and passwd=%s'
args = (name, pwd)
cur.execute(sql, args)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
</head>
<body>
<h1>登录</h1>
<div class="col-md-6 col-md-offset-3">
    <form action="/login/" method="post">
        <p>用户名: <input type="text" name="name" class="form-control"></p>
        <p>密码: <input type="password" name="pwd" class="form-control"></p>
        <input type="submit" value="提交">
    </form>
</div>
</body>
</html>
login.html
# form表单中action: 提交到后台的地址三种写法:
    # 1 全路径http://127.0.0.1:8000/login/
    # 2 空   默认提交到浏览器中当前的url里
    # 3 根据urls.py里配置的写 /login/

# method的两种方式:
   # post: 往后台提交数据
   # get: 获取数据、页面、携带不重要的数据(数据量大小有限制)

# 提交的两种写法
  # <input type="submit" value="提交">
  # <button>提交</button>  
  # <input type="button" value="提交">#} type=button仅仅是个按钮,不会向后台提交数据
原文地址:https://www.cnblogs.com/lichunke/p/9983045.html