zoukankan      html  css  js  c++  java
  • Django(一)

    手动编写一个web简易框架

    import socket
    
    server = socket.socket()
    server.bind(
        ('127.0.0.1', 8080)
    )
    server.listen(5)
    """
    b'GET /index HTTP/1.1
    
    Host: 127.0.0.1:8080
    
    Connection: keep-alive
    
    Upgrade-Insecure-Requests: 1
    
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
    
    Sec-Fetch-User: ?1
    
    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
    
    Sec-Fetch-Site: none
    
    Sec-Fetch-Mode: navigate
    
    Accept-Encoding: gzip, deflate, br
    
    Accept-Language: zh-CN,zh;q=0.9
    
    '
    """
    while True:
        conn, addr = server.accept()
        data = conn.recv(1024)
        # print(data)
        conn.send(b'HTTP/1.1 200 OK
    
    ')
        data = data.decode('utf-8')     # 将字节变成字符串
        # 获取用户网址后的输入
        target_url = data.split('
    ')[0].split(' ')[1]
        # print(target_url)
        if target_url == '/index':
            conn.send(b'index')
        elif target_url == '/login':
            with open(r'D:Python13期day36	emplatesdemo.html', 'rb')as f:
                conn.send(f.read())
        else:
            conn.send(b'404 error')
        conn.close()

    基于wsgiref模块设计

    文件拆分:

    urls.py: 路由与视图函数的对应关系
    views.py: 里面就是放的一堆视图函数(视图函数可以是函数也可以是类)
    templates文件夹: 里面放的就是一堆html文件(模板文件夹)

    基于wsgiref模块以及文件拆分特点:

    1.先在urls文件中写url与函数的对应关系
    2.再去views文件中写对应的函数

    示例:

    from wsgiref.simple_server import make_server
    from day36.urls import urls
    from day36.views import *
    
    
    def run(env, response):
        """
        :param env: 请求相关的所有数据
        :param response: 响应相关的所有数据
        :return: 浏览器能够接收的内容
        """
        response('200 OK', [])
        # env: 大字典里面的PATH_INFO参数就是用户输入的后缀
        target_url = env.get('PATH_INFO')
    
        func = None
    
        for url in urls:
            if target_url == url[0]:
                func = url[1]
                break
    
        if func:
            res = func(env)
        else:
            res = error_404(env)
        return [res.encode('utf-8')]
    
    
    if __name__ == '__main__':
        server = make_server(
            '127.0.0.1', 8080, run
        )
        # 启动服务端
        server.serve_forever()
    run.py
    from day36.views import *
    
    # 路由视图函数对应关系
    urls = [
        ('/index', index),
        ('/login', login),
        ('/get_time', get_time),
        ('/get_dic', get_dic),
        ('/get_db', get_db)
    ]
    urls.py
    import time
    from jinja2 import Template
    import pymysql
    
    
    def index(env):
        return 'index'
    
    
    def login(env):
        return 'login'
    
    
    def error_404(env):
        return '404 error'
    
    
    def get_time(env):
        current_time = time.strftime('%Y-%m-%d %X')
        with open(r'D:Python13期day36	emplatesget_time.html', 'r')as f:
            data = f.read()
        data = data.replace('time', current_time)
        return data
    
    
    def get_dic(env):
        user_dic = {
            'username': 'tank',
            'pwd': 123,
            'hobby': ['read', 'run', 'talk']
        }
        with open(r'D:Python13期day36	emplatesget_dic.html', 'r')as f:
            data = f.read()
        temp = Template(data)
        res = temp.render(dic1=user_dic)
        return res
    
    
    def get_db(env):
        conn = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            user='root',
            password='123',
            database='test1',
            charset='utf8',
            autocommit=True
        )
        cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
        sql = 'select * from teacher'
        cursor.execute(sql)
        data = cursor.fetchall()
        with open(r'D:Python13期day36	emplatesget_db.html', 'r', encoding='utf-8')as f:
            res = f.read()
        tmp = Template(res)
        res = tmp.render(db=data)
        return res
    view.py

    3.创建一个templates文件夹,里面用来存放HTML文件

    jinja2模块

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

    {{ 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>

    后端大致框架

    1.路由与视图函数对应关系
    2.视图函数
    3.模板文件夹
    4.模板语法(是在后端实现的 前端根本不识别)

    django框架

    1.注意事项

    - 计算机名称不能有中文
    - 项目文件名也不要用中文
    - 一个pycharm窗口就是一个单独的完整的项目

    2.创建django项目

    命令行: 

      创建django项目:django-admin startproject mysite(项目名)

      启动django项目(先切换到项目目录下):python3 manage.py runserver # django默认的端口号是8000

      创建具有独立功能的app:python manage.py startapp app01

    pycharm快捷创建

    两者创建区别: 

    1.使用命令行创建的django项目是不会自动创建templates摸版本文件夹 你只能自己手动创建
    2.命令行创建的django项目不但没有templates文件夹配置文件中也没有填写路径,而pycharm创建的会自动添加

    3.app概念

    app就是应用意思

    django其实是一个专注于开发app的web框架,一个空的django项目就类似于是一所大学,app就类似于大学里面的各个学院,每个app其实就类似于不同的功能模块

    例如一个购物网站:

    用户相关 user
      用户相关的app
    订单相关 order
      订单相关的app
    投诉相关 tousu
      投诉相关的app
    不同的功能模块推荐使用不同的app去开发

    django支持多app

    4.django主要文件功能

    mysite
        -mysite
            --__init__.py
            --settings.py  项目配置文件
            --urls.py      路由视图函数对应关系 项目的总路由
            --wsgi.py      
        -manage.py
        app01
            --migrations文件夹  数据库改动记录
                ----__init__.py
            --__init__.py
            --admin.py            django后台管理
            --apps.py            注册app相关
            --models.py         模型类(ORM)
            --tests.py            测试文件
            --views.py          视图函数(******)
        app02
            --migrations文件夹  数据库改动记录
                ----__init__.py
            --__init__.py
            --admin.py            django后台管理
            --apps.py            注册app相关
            --models.py         模型类(ORM)
            --tests.py            测试文件
            --views.py          视图函数(******)
        db.sqlite3                django自带的一个小型用于本地测试的数据库(对日期格式的数据不是很敏感)

    5.django三板斧

    HttpResponse:返回字符串

    render:返回html页面  并且可以给html页面传数据

    redirect:重定向

    def index(request):
        return HttpResponse('你好啊')
    
    
    def login(request):
        return render(
            request,
            'login.html',
            {'user_dic': {'username': 'jason', 'password': '123'}}
        )
    
    
    def home(request):
        return redirect('http://www.baidu.com')
  • 相关阅读:
    Java8新特性
    为什么要使用ORM技术?和 JDBC 有何不一样?
    HTTP Status 500
    重装Oracle时出现SID已存在问题的解决办法
    数据库模式显示的Swing表格
    自然连接和等值连接
    雷林鹏分享:Java 循环结构
    雷林鹏分享:Java 运算符
    雷林鹏分享:Java 修饰符
    雷林鹏分享:Java 变量类型
  • 原文地址:https://www.cnblogs.com/hexianshen/p/12146581.html
Copyright © 2011-2022 走看看