zoukankan      html  css  js  c++  java
  • 二、Django的安装和简单的运行

    一、MVC和MTV框架

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

    • MTV
      Django的模式就是MTV

      • M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
      • T 代表模板 (Template):负责如何把页面展示给用户(html)。
      • V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
      • 除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template

    二、django的下载安装

    官网地址:https://www.djangoproject.com/download/

    目前版本是用的1.11版本的,等2020年再去学习2.2版本的

    1. cmd终端创建启动Django项目

    2. 下载Django:
      pip3 install django==1.11.9

    3. 创建一个django project
      django-admin startproject mysite 创建了一个名为"mysite"的Django 项目:

      因为执行的pip.exe,所以Django会安装在pip所在的文件下;

      当发现scripts文件夹中有Django,就安装成功,就不用再去配置环境;

      安装完成后,去创建一个django project,若出现以下情况,说明环境变量没有配置好,要把你安装的Django的路径配置在环境变量中

    4. 创建的项目文件介绍
      创建成功后,目录会生成mysite的工程,目录如下:

      • manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库,启动关闭项目与项目交互等,不管你将框架分了几个文件,必然有一个启动文件,其实他们本身就是一个文件。
      • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
      • urls.py ----- 负责把URL模式映射到应用程序。
      • wsgi.py ---- runserver命令就使用wsgiref模块做简单的web server,后面会看到renserver命令,所有与socket相关的内容都在这个文件里面了,目前不需要关注它。
    5. 运行项目
      python manage.py runserver 127.0.0.1:8080
      #此时已经可以启动django项目了,只不过什么逻辑也没有呢
      通过指令运行项目的时候,可以不写ip地址、端口
      如果不写,默认是127.0.0.1
      python manage.py runserver 8080
      如果连端口都不写,默认是8000端口
      python manage.py runserver

      停止项目:ctrl+c
      

      当出现以上效果,说明项目已经启动成功了,就可以通过网页输入127.0.0.1:8080来访问了,效果如下:

    6. 在mysite下创建应用
      会发现,上面没有view视图函数的文件等等,这些文件可以理解为应用,一个项目可以有多个应用,比如微信,就有支付应用、聊天应用、小程序、朋友圈等等...每个应用都应该有自己的逻辑内容,需要自己去单独创建应用
      python manage.py startapp app01
      #通过执行manage.py文件来创建应用,注意:应该在这个manage.py的文件所在目录下执行这句话,因为其他目录里面没有这个文件
      cmd执行命令后,除了之前有的manage.py和mysite文件夹,又新生成了一个新的文件夹app01,文件夹内容如下:

    7. pycharm创建启动Django项目

    创建Django的项目,很少用命令行了,用 pycharm就能创建

    1. 在 File 下选 New Project

    2. 配置Django选项

    3. 创建,在新窗口打开

    4. 生成的文件目录如下:

      其中的templates是pycharm帮助我们直接创建好的,放一些模板,也就是html文件。

    5. 运行项目:

      点击运行后,出现以下情况,就是启动项目成功了

      此时,在网页输入127.0.0.1:8000,就可以访问了

      这是因为我们还没有写任何的逻辑,然后,我们做一个简单的登录功能

    6. 基于Django实现一个简单的示例

    我们做一个登录的页面的web项目,浏览器输入一个网址就能得到这个登录的web页面

    1. 先找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(r'^index/', views.index),  # 模仿写出路由的配置
          # 配置路径,r'^/index/',这个前置导航斜杠不需要添加.
          # 正则,可以让路径不用写死,index/dsad/qweq/fdsf/...也能匹配到
      ]
      
    2. 再写视图函数 views
      from django.shortcuts import render

      # Create your views here.
      
      def index(request):# request是一个形参,接受所有请求的内容
          return render(request,'login.html')
      

      render后面可以直接写html文件的原因:
      之所以可以直接写 login.html,是因为settings.py的配置文件中已经配置好了路径,可以直接拿到

      • 在settings.py的配置文件中有
        • TEMPLATES 中有一项 'DIRS': [os.path.join(BASE_DIR, 'templates')]
        • BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
      • abspath(file)是settings本文件
      • os.path.dirname(os.path.abspath(file))是settings的父目录文件夹 third_pro
      • os.path.dirname(os.path.dirname(os.path.abspath(file))) 是整个这个项目的文件夹 third_pro
      • 所以 BASE_DIR 就是这个项目的文件夹,也就是最外层的那个文件夹 third_pro
      • 'DIRS': [os.path.join(BASE_DIR, 'templates')] 是路径的拼接,就可以直接找到templates里面的html文件了
    3. 写模板 templates,在这里创建html文件

      <h1>欢迎来到登录页面</h1>
      
      <form action="">
          用户名:<input type="text" name="username">
          密  码:<input type="text" name="password">
          <input type="submit">
      </form>
      

      注意:name属性必须要有,因为通过表单提价数据的时候,可以把用户输入的值带过去

    4. 这样就简单完成了一个web项目
      通过输入127.0.0.1:8000/index,就能拿到我们写好的页面

    5. 完善Django实现的登录功能

    用户输入用户名密码,在后台判断输入的用户名密码是否正确

    首先 区分一下 get请求 和post请求

    • form表单默认get请求
      用户提交的数据还是返回给 index 那个路径
      request.GET -- GET请求发送来的所有数据,queryDict类型

      <input name='username'>
      	request.GET.get('username')
          # 获取 name='username' 的 input 标签用户输入的内容
      
    • post请求
      request.POST -- POST请求发送来的所有数据,queryDict类型

      <input name='username'>
      	request.POST.get('username')
          # 获取 name='username' 的 input 标签用户输入的内容
      

    因为要获取用户提交的数据,表单提交有两种方法:

    1. get请求数据:

      from django.shortcuts import render,HttpResponse

      def index(request):
      print(request.GET) #<QueryDict: {'username': ['dazhuang'], 'password': ['123']}>
      username = request.GET.get('username')
      password = request.GET.get('password')
      print(username,password)
      if username == 'dazhuang' and password == '123':
      return HttpResponse('登录成功!') --- 回复字符串数据
      else:
      return HttpResponse('失败!')
      return render(request, 'login.html')

    出现问题:当直接通过路径请求页面,是get请求,form表单提交数据也是get请求,会分不清,所以请求页面用get请求,form表单提交数据用post请求

    1. post请求数据:

    views视图函数文件写:

    def index(request):
        print(request.method) #'POST' 'GET'
        if request.method == 'GET':
            return render(request,'login.html')
    
        else:
            # print(request.GET)
            print(request.POST)
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'dazhuang' and password == '123':
                return HttpResponse('登录成功!')
            else:
                return HttpResponse('登录失败!')
    

    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>Bootstrap 101 Template</title>
    
    </head>
    <body>
    <h1>欢迎来到登录页面</h1>
    
    <form action="/index/" method="post">  # 给一个method属性规定post请求
        用户名:<input type="text" name="username">
        密  码:<input type="text" name="password">
        <input type="submit">
    </form>
    
    </body>
    </html
    

    settings文件:

    post请求提交数据时关掉一个认证机制,settings配置文件中

    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',
    ]
    

    最终效果:

    输入正确的用户名、密码:dazhuang、123,提交,
    

    显示登录成功,否显示登录失败

    一些注意的点:

    • urls.py里面需要注意的问题
      url(r'^index/', views.index), 第一个参数:路径正则字符串 第二个参数:对应的视图函数
    • views.py
      def login(request):
      获取请求方法:request.method--'GET','POST'
      request.GET -- GET请求发送来的所有数据,queryDict类型
      request.POST -- POST请求发送来的所有数据,queryDict类型

      request.POST.get('username')
      request.GET.get('username')
      return HttpResponse('字符串') --- 回复字符串数据
      retuen render(request,'login.html')

    三、简单总结

    1. django下载安装

      下载:pip install django==1.11.9

      创建项目
      django-admin startproject qingqing
      cd qingqing
      启动项目:python manage.py runserver 127.0.0.1:8001
      cd qingqing
      创建app:python manage.py startapp xiaoqing

      需要在项目的配置文件settings.py中添加一个app的配置
      INSTALL_APPS = [
      'xiaoqing', app名称
      ]

      INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      # 以下两种写法都可以
      'app01.apps.App01Config',
      #'app01',
      ]

    2. 两个框架模式

      MVC
      M:models数据库相关
      V:views 视图逻辑相关
      C:controller控制器 url分发 不同的路径找到不同的视图函数
      MTV
      M:models数据库相关
      T:templates模板 ,HTML文件
      V:views 视图逻辑相关
      + url控制器 不同的路径找到不同的视图函数
      MVVM

  • 相关阅读:
    TOJ 5021: Exchange Puzzle
    Educational Codeforces Round 26
    2017 Multi-University Training Contest
    TOJ 5020: Palindromic Paths
    数论之 莫比乌斯函数
    TOJ 4475: The Coolest Sub-matrix
    Game on Tree
    python 线程
    python 管道、数据共享、进程池
    python 守护进程、同步锁、信号量、事件、进程通信Queue
  • 原文地址:https://www.cnblogs.com/yangzm/p/11209808.html
Copyright © 2011-2022 走看看