zoukankan      html  css  js  c++  java
  • Django知识整理一(Http协议,wsgire模块,动静态网页介绍,python三大主流框架,Django安装的注意事项,)

    http协议

    四大特性

    • 基于tcp/ip协议之上作用于应用层
    • 基于响应 请求
    • 无状态
    • 无连接

    数据格式

    请求方式

    • get请求 :朝别人要数据
    • post请求 : 朝别人提交数据

    请求格式

    • 请求首行(请求格式,协议版本)
    • 请求头(一大推k:v键值对)
    • (空格)
    • 请求体(get请求没有请求体)

    响应格式

    (格式与请求格式相同)

    响应状态码

    1xx:服务器成功接收到你的数据,正在处理,你可以继续提交其他数据

    2xx: 服务器响应成功 (200 ok)

    3xx: 重定向

    4xx: 请求错误(404 请求资源不存在. 403 拒绝访问)

    5xx: 服务器内部错误

    wsgiref模块

    它是一个web服务网关接口,它主要做了下面几件事:

    1. 自动帮你封装好了socket代码

    2. http数据自动帮你处理好了:

      • 请求来的时候自动帮你处理http数据格式,返回一串字典格式的数据.
      • 响应走的时候帮你把字典格式的数据封装成了符合http协议的数据格式
    3. 根据不同的功能拆分成不同的py文件

    • urls.py 路由与视图函数对应关系
    • views.py 处理后端业务逻辑的视图函数 (视图函数不单单只是函数,也可以是类)
    • templates 专门存放html文件

    规律: 只要你想添加功能 只需要在urls.py中添加一条对应关系再去views.py写一个视图函数

    动静态网页

    静态网页: 数据是写死的,万年不变

    动态网页: 数据是实时获取的

    • 如果将后端获取到的时间(字符串)传递给前端页面,可以利用字符串的替换 实现数据传递(replace方法)
    from datetime import datetime
    
    def get_time(env):
        current_time = datetime.now().strftime('%Y-%m-%d %X')
        with open(r'D:上海Python11期视频python11期视频day56	emplatesget_time.html','r',encoding='utf-8') as f:
            data = f.read()
        data = data.replace('$$time$$',current_time)
    
        return data
    

    前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    $$time$$
    </body>
    </html>
    
    • 如果将字典传递给前端页面,并且可以在前端使用字典的方法,就需要借助于jinjia2模块,实现模块的渲染

      jinja2 下载
      pip3 install jinja2
      
      from jinja2 import Template
      
      def get_user(env):
          d = {'name':'jason','pwd':'123','hobby':		 ['read','running','music']}
          with open(r'D:上海Python11期视频python11期视频day56	emplatesget_user.html','r',encoding='utf-8') as f:
              data = f.read()
          temp = Template(data)
          res = temp.render(user=d)  # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
          return res
      

      前端

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
          <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
          <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
      </head>
      <body>
      <p>{{ user }}</p>
      <p>{{ user.name }}</p>
      <p>{{ user['pwd'] }}</p>
      <p>{{ user.get('hobby') }}</p>
      </body>
      </html>
      

      模板的渲染 : 利用 模板语法,实现后端传递数据给前端html页面模板语法的书写格式;

      • 模板语法(极其贴近python后端语法)

        	#变量名
        	<p>{{ user }}</p>
        	<p>{{ user.name }}</p>
        	<p>{{ user['pwd'] }}</p>
        	<p>{{ user.get('hobby') }}</p>
        	#语法
        	{% for user_dict in user_list %}
        		<tr>
        			<td>{{ user_dict.id }}</td>
        			<td>{{ user_dict.name }}</td>
        			<td>{{ user_dict.pwd }}</td>
        		</tr>
        	{% endfor %}
        
    • 如果将数据库中的数据传给前端

    import pymysql
    
    def get_db(env):
        conn = pymysql.connect(
            host = '127.0.0.1',
            port = 3306,
            user = 'root',
            password = 'root',
            database = 'day56',
            charset = 'utf8',
            autocommit = True
        )
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = "select * from userinfo"
        cursor.execute(sql)
        res = cursor.fetchall()
        print(res)
        with open(r'D:上海Python11期视频python11期视频day56	emplatesget_db.html','r',encoding='utf-8') as f:
            data = f.read()
        temp = Template(data)
        ret = temp.render(user_list = res)  # 将字典d传递给前端页面 页面上通过变量名user就能够获取到该字典
    
    

    前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
    </head>
    <body>
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <h1 class="text-center">用户列表</h1>
                <table class="table table-bordered table-striped table-hover">
                    <thead>
                        <tr>
                            <th>id</th>
                            <th>name</th>
                            <th>pwd</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for user_dict in user_list %}
                            <tr>
                                <td>{{ user_dict.id }}</td>
                                <td>{{ user_dict.name }}</td>
                                <td>{{ user_dict.pwd }}</td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    
    </div>
    </body>
    </html>
    

    以上是为了加深理解动态网页而举的三个例子

    python三大主流框架

    Django

    • 特点 :大而全,自带的功能特别多,类似于航空母舰
    • 缺点: 有时候过于笨重

    Flask:

    • 特点: 小而精, 第三方的模块特别多, 类似游骑兵(如果将flask第三方模块全部加起来,完全可以超过Django)
    • 缺点 : 自带功能特别少 , 比较依赖于第三方模块

    Tornado

    • 异步非阻塞
    • 速度快,牛逼到可以开发游戏服务器
    A:socket部分
    B:路由与视图函数对应关系
    C:模板语法
    
    Django:
    	A用的别人的  wsgiref
    	B自己写的
    	C自己写的
    Flask
    	A用的别人的  werkzeug(基于wsgiref)
    	B自己写的
    	C用的别人的  jinja2
    Tornado
    	三者全是自己写的
    

    安装Django前注意事项

    • 计算机不能为中文
    • 一个pycharm窗口代表一个项目
    • 项目名或者路径里不要有中文

    下载安装Django

    pip3 install django==1.11.11(命令行)
    

    验证Django是否安装成功

    django-admin
    

    一个django项目就类似于是一所大学,而app就类似于大学里面的学院
    django其实就是用来存放一个个应用的,django支持任意多个app(应用)
    一个app就相当于一块独立的功能
    用户功能
    管理功能

    命令行使用

    创建django项目
    	django-admin startproject mysite(项目名)
    启动django项目
    	python manage.py runserver 
    创建应用app
    	python manage.py startapp app01(应用名)
    
    
    注意:
    1.使用命令行创建django项目 不会自动帮你创建templates文件夹只能自己创建
    2.templates文件夹创建完成后还需要到settings文件中手动在TEMPLATES项里写配置
        [os.path.join(BASE_DIR, 'templates')]
    3. 新创建的app文件夹需要你去settings配置文件中注册(INSTALLED_APPS项包含所有注册应用),有两种书写方式:
        完整语法:'app01.apps.App01config'
        简写:'app01'
        
    

    pycharm使用

    直接在pycharm中新建一个django项目
    注意:
        pycharm只会帮你自动注册第一个你在创建项目的时候写的应用,之后的应用需要自己手动在settings中注册(INSTALLED_APPS项包含所有注册应用),有两种书写方式:
        完整语法:'app01.apps.App01config'
        简写:'app01'
    '''
    项目名
        跟项目名同名的文件夹
            settings.py  暴露给用户的配置文件
            urls.py  路由与视图函数对应关系
        应用名
            migrations文件夹  存放数据库迁移记录的
            admin.py  django后台管理
            apps.py  注册相关
            models.py  模型类 
            tests.py  测试文件
            views.py  存放视图函数
        templates文件夹  存放html文件
        manage.py  django入口文件
    '''
    
  • 相关阅读:
    [Ramda] Create a Query String from an Object using Ramda's toPairs function
    UVA 10285 Longest Run on a Snowboard(记忆化搜索)
    为什么鲍尔默现在说要辞职?
    c++中经常需要访问对象中的成员的三种方式
    【实用技术】DreamWeaver常用快捷键
    Objective-C中NSString和NSMutableString的基本用法
    《数据通信与网络》笔记--IPSec
    最小费用最大流模板 poj 2159 模板水题
    UVa 10192: Vacation
    C++按值和按址传递对象的思考和优化
  • 原文地址:https://www.cnblogs.com/asyouwish/p/11762688.html
Copyright © 2011-2022 走看看