一文帮助快速入门Django

news2025/1/16 3:50:59

文章目录

  • 创建django项目
  • 应用app
    • 配置pycharm
    • 虚拟环境
    • 打包依赖
  • 路由
    • 传统路由
    • include路由分发
    • name
    • namespace
  • 视图
  • 中间件
  • orm关系对象映射
    • 操作表
    • 数据库配置
    • model常见字段及参数
    • orm基本操作
  • cookie和session
  • demo

创建django项目

指定版本安装django:pip install django==3.2

命令行创建django项目:

  1. 先进入到要保存项目的目录中
  2. 然后执行:django-admin startproject 项目名

可以看到创建了这么些文件:

在这里插入图片描述

  • manage.py:项目的管理工具
  • wsgi.py:提供同步的socket服务
  • asgi.py:异步
  • urls.py:主路由
  • settings.py:配置文件,只有一部分,程序启动时会先读取django内部的配置,再读取该文件的配置

内部配置文件路径:

在这里插入图片描述
在这里插入图片描述

编写示例代码:

from django.urls import path
from django.shortcuts import HttpResponse

# 调此函数会带一个request参数,可使用request获取请求数据
def login(request):
    # django的响应是一个封装的对象
    return HttpResponse('登录成功')

urlpatterns = [
    # path("admin/", admin.site.urls),
    path('user/login', login) # 只能写函数名
]

运行:python manage.py runserver
指定端口运行:python manage.py runserver 127.0.0.1:8080

执行运行命令前先进入项目目录
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

应用app

将项目分成不同的功能模块,每个模块对应一个app应用

创建app:进入项目目录执行python manage.py startapp 应用名

在这里插入图片描述

多app的创建:

  1. 在项目目录下创建apps目录,在apps目录下创建以要创的app名为名称创建目录
    在这里插入图片描述
  2. 执行:python manage.py article apps/article
    在这里插入图片描述
  3. 修改该文件内容
    在这里插入图片描述
  4. 注册app
    在这里插入图片描述

调整示例代码结构:

在user应用中的views.py文件编写下列代码:

from django.shortcuts import HttpResponse

def login(request):
    return HttpResponse('login success')

def register(request):
    return HttpResponse('register fail')

修改urls.py文件的路由配置

from django.urls import path
from user import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('login/', views.login),
    path('register/', views.register)
]

启动项目,访问
在这里插入图片描述

配置pycharm

配置pycharm启动django项目:

在这里插入图片描述

虚拟环境

使用命令行创建虚拟环境:python官方用于创建虚拟环境的工具:python3.8 -m venv xxx
该命令会基于系统python环境创建出一个虚拟环境,xxx为名称或目录

使用第三方工具:virtualenv,先安装:pip install virtualenv
创建:virtualenv xxx --python=python3.8
激活:

  • win:
    cd venv/Scripts
    activate
  • mac:
    source /venv/bin/activate

退出虚拟环境:deactivate

打包依赖

pip freeze > requirements.txt

在这里插入图片描述
安装依赖:pip install -r requirements.txt

路由

传统路由

路由系统主要是维护url与函数的映射关系

url中包含参数:

path('user/gethead/<int:id>/', views.get_head)

类型:

  • int,整数
  • str,字符串,但不能匹配/
  • slug,字母,数字,下划线,-
  • uuid,uuid的格式
  • path,路径,可包含/
    path('article/del/<int:id>/', delete),
    path('article/del/<str:id>/', delete),
    path('article/del/<uuid:id>/', delete),
    path('article/del/<path:id>/', delete),

直接在函数中添加参数可获取值

def get_head(request, id):
    return HttpResponse(id)

在这里插入图片描述

路由中包含正则,path替换为re_path

def article(request):
    id = request.GET.get('id')
    return HttpResponse(id)

注意:参数id字段要一致
在这里插入图片描述

include路由分发

导包include
主路由:

	from django.urls import path, include
    # 路由匹配到前缀为user,则分发给apps.user中的urls,include中为路径字符串
    path('user/', include('apps.user.urls')),
    path('article/', include('apps.article.urls'))

在user应用中创建urls文件,然后编写路由规则

urlpatterns = [
    path('add/', views.login)
]

在这里插入图片描述

效果:会先找到主路由user/,然后在分发的文件中匹配到add/,完整的路由为user/add/

手动路由分发

    path('user/', ([
        path('del/', views.login),
        path('insert/', views.insert)
                   ], None, None)) # 第一个None为app_name,第二个None为namespace

匹配的url为:user/del/,user/insert/
在这里插入图片描述
include的本质

name = 'zs'

# 相当于导包 from apps.user import urls
module = importlib.import_module("apps.user.urls")
# 也可以使用module.name获取name的值
# 从module中获取name的值,如果获取不到则默认为ls
n = getattr(module, 'name', 'ls')
n = getattr(module, 'name') # 获取不到会直接报错

name

给路由起名字,可以通过名字反向生成url

    path('user/login/', views.login, name='v1'),
    path('user/register/', views.register, name='v2')
def login(request):
    # 在这个视图里,需要重定向到register里,就可以不写url,直接使用name即可
    from django.urls import reverse # 需要导包

    url = reverse('v2')
    return redirect(url) # 重定向,里面是url地址,使用name反推出的url,不用填写真是的url地址

namespace

用来辅助name的,当出现同名的name时,使用name反推出url可能会出现问题,这时候就可以使用namespace来区分不同的name

    path('user/', include('apps.user.urls', namespace='user'))
   path('login/', views.login, name='v1'),
   path('register/', views.register, name='v2')
def login(request):
    # 在这个视图里,需要重定向到register里,就可以不写url,直接使用name即可
    from django.urls import reverse # 需要导包
    
    url = reverse('user:v1') # namespace名:name名
    return redirect(url) # 重定向,里面是url地址,使用name反推出的url,不用填写真是的url地址

使用namespace时,必须提供app_name

from django.urls import path
from apps.user import views

urlpatterns = [
   path('login/', views.login, name='v1'),
   path('register/', views.register, name='v2')
]

app_name = 'user'

如果不提供,会报错
在这里插入图片描述

也可以主动去进行路由分发

    path('user/', ([
        path('login/', views.login, name='v1')
    ], 'user', 'user')) # 第一个user为app_name,第二个user为namespace

路由中尾部的/
路由中带/,但是url不带/访问:127.0.0.1:8000/login

path('login/', views.login)

在这里插入图片描述
会发现其实是进行了两次请求,第一次找不到路经,django自动将/加上再访问一次

这个是由于配置文件中默认APPEND_SLASH=True导致的

如果想严格控制url,可以在settings文件中添加APPEND_SLASH=False

在这里插入图片描述
再进行访问
在这里插入图片描述

在这里插入图片描述

当前url的匹配对象
通过request.resolver_match获取

def login(request):
    cur_obj = request.resolver_match
    print(cur_obj)
    return HttpResponse('login')

在这里插入图片描述
拿到这个有什么用?可以做权限处理

    path('login/', views.login, name='test')
def login(request):
    permissions = ['user', 'article', 'music'] #用户具有的权限,都是name
    cur_obj = request.resolver_match.url_name #获取当前请求的name
    if cur_obj not in permissions:
        return HttpResponse('没有权限')
    print(cur_obj)
    return HttpResponse('login')

在这里插入图片描述

视图

一般功能多的时候,这样创建视图文件
在这里插入图片描述
通过request对象获取请求内容

def login(request):
    print(request.path_info) # 请求url
    print(request.GET.get('username')) # 获取get请求参数
    print(request.GET.get('passowrd'))
    print(request.headers) # 请求头   字典类型
    print(request.COOKIES) # cookie  字典类型
    print(request.method) # 请求方法

    print(request.body) # 原始请求体

    # 获取post请求参数
    # 只针对body格式为a=123&b=abc,且content-type为from表单格式(application/x-www-from-urlencoded)
    print(request.POST.get('username'))
    print(request.POST.get('password'))

    # 获取文件 请求头为multipart/form-data
    request.FILES.get('name1')
    request.FILES.get('name2')

返回数据:

  1. 返回字符串/字节/文本数据
return HttpResponse('xxx')
  1. 返回json数据
def hello(request):
    from django.http import JsonResponse
    ret_dict = {
        'code': 200,
        'data': 'xxx'
    }
    return JsonResponse(ret_dict)
    #return HttpResponse(json.dumps(ret_dict)) 使用json库
  1. 重定向
return redirect('https://www.baidu.com') # 参数为url或者url的name

设置响应头

    ret = HttpResponse('hello world')
    ret['auto'] = 'true'
    ret['name'] = 'zs'
    ret.set_cookie('key', 'value')
    return ret

中间件

MiddlewareMixin
在项目根目录下,创建middlewares目录,在该目录里创建自定义中间件
在这里插入图片描述

from django.utils.deprecation import MiddlewareMixin

class MyMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print('调用视图前')
    def process_response(self, request, response):
        print('调用视图后')
        return response

创建完中间件必须在settings文件中进行注册,中间件是以类定义的
在这里插入图片描述
当在process_request函数中有返回值的时候,那么不会进入视图函数的执行而是接着执行process_response函数

注意:路由匹配是在执行完process_request函数后才匹配到的,也就是process_request函数的request参数为None

process_view

	# view_func是匹配到的路由函数,view_args,view_kwargs是路由的参数
    def process_view(self, request, view_func, view_args, view_kwargs):
        print(request, view_func)

在这里插入图片描述
如果想在前置操作中根据视图函数做一些逻辑可以使用process_view

process_exception

    # 当视图中出现异常时,会捕获到
    def process_exception(self, exception):
        print(exception)

orm关系对象映射

对表的操作(表的创建,修改,删除)
对数据的操作(增删改查)

操作表

在app的models.py文件创建类,一个类就对应一个表结构

  1. 按照规则创建类
from django.db import models
# 生成的表名默认为user_userinfo(app名_类名小写)
class UserInfo(models.Model):
	# 默认会生成一个字增主键id
    name = models.CharField(max_length=10)
    age = models.IntegerField()
  1. 注册app(根据注册的app找migrations目录,可以将用不到的app去掉,避免创建使用不到的表)
  2. 执行命令python manage.py makemigrations
    会自动在app目录下的migrations目录下创建一个配置文件
    在这里插入图片描述
  3. 执行命令python manage.py migrate,根据配置文件转换sql语句,链接数据库,执行sql

执行上述命令前,先进行下面的数据库配置

数据库配置

先安装链接mysql的库pymysql/mysqlclient,pip install pymysql
在settings文件中将默认的数据库配置修改下

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog', # 数据库名
        'USER': 'root',
        'PASSWORD': '12345678',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

使用pymysql时,在settings文件的同级目录init文件中添加如下内容

import pymysql
pymysql.install_as_MySQLdb()

在这里插入图片描述

注意:不要手动修改表结构,如果要修改可以修改models文件中的字段,再执行上述的两条命令

数据库连接池
pip install django-db-connection-pool

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog', # 数据库名
        'USER': 'root',
        'PASSWORD': '12345678',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'POOL_OPTIONS': {
            'POOL_SIZE': 10, # 最小连接数
            'MAX_OVERFLOW': 10, # 额外增加的连接数
            'RECYCLE': 24 * 60 * 60, # 每个连接最长可以使用多久
            'TIMEOUT': 30,  # 无连接时,最长等待时间
        }
    }
}

model常见字段及参数

class UserInfo(models.Model):
    # CharField为字符串,max_length为字符串的最大长度,verbose_name字段含义,默认null=False不许为空
    # 一般null和blank结合使用,null指数据库是否为可为空,blank为页面是否可为空
    name = models.CharField(verbose_name='姓名', max_length=10, default='无名氏', null=True, blank=True)
    # db_index表示添加索引,unique唯一约束
    age = models.IntegerField(verbose_name='年龄', db_index=True, unique=True)
    rage = models.BigIntegerField(verbose_name='长整型年龄')
    content = models.TextField(verbose_name='详情')

    # auto_now,当插入数据不传该字段时会使用当前时间
    create_data = models.DateField(verbose_name='日期', auto_now=True) # 日期:年月日
    rcreate_data = models.DateTimeField(verbose_name='时间') # 时间:年月日时分秒
    active = models.BooleanField(verbose_name='是否')
    # max_digits总共位数,decimal_places小数点后几位
    salary = models.DecimalField(verbose_name='余额', max_digits=10, decimal_places=2)

表关系

一对多:

class UserInfo(models.Model):
    '''用户表'''
    name = models.CharField(max_length=5, verbose_name='员工姓名')
    age = models.IntegerField(verbose_name='年龄')
    # ForeignKey外键,to表示与哪张表关联,to_field表示与哪个字段关联
    # on_delete=models.CASCADE表示级联删除,models.SET_NULL表示设置为null
    # models.SET_DEFAULT表示设置默认值
    # 数据库生成的字段会默认给depart加上_id,depart_id
    depart = models.ForeignKey(verbose_name='部门id',default=1, null=True, blank=True, to='Depart', to_field='id', on_delete=models.SET_DEFAULT)
class Depart(models.Model):
    '''部门表'''
    name = models.CharField(verbose_name='部门名称')

多对多:

class UserInfo(models.Model):
    name = models.CharField(max_length=5, verbose_name='姓名')
class MusicInfo(models.Model):
    title = models.CharField(max_length=20, verbose_name='音乐标题')
class UAndM(models.Model):
    nid = models.ForeignKey(to=UserInfo, to_field='id', verbose_name='用户id')
    tid = models.ForeignKey(to=MusicInfo, to_field='id', verbose_name='音乐id')

orm基本操作

单表操作
增:

def register(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    dict = {
        'username': username,
        'password': password
    }
    # 方式1
    # 返回值是以UserInfo这个类创建的对象
    # user = models.UserInfo.objects.create(username=username, password=password)
    user = models.UserInfo.objects.create(**dict) # 匹配的参数类型是**kwargs,使用字段传参时,要带上**
    print(user.username)
    print(user.password)
    # 批量插入
    models.User.objects.bulk_create(
        objs=[models.User(name='zs', age=10),models.User(name='ls', age=12)],
        batch_size=2 # 一次提交几条
    )
    # 方式2
    user1 = models.UserInfo(username='zs', password='123')
    user1.save()
    return HttpResponse(user)

删:

 # 删除
    # 返回值是受影响的行数
    n1 = models.UserInfo.objects.all().delete()
    n2 = models.UserInfo.objects.filter(username='zs').delete()

更新:

# 更新
    # 返回值是受影响的行数
    n3 = models.UserInfo.objects.all().update(password='123')
    n4 = models.UserInfo.objects.filter(username='zs').update(password='123')

查询:

    # 查
    list = models.UserInfo.objects.all() # 返回类型是queryset(类似列表),里面存放一个个对象
    # list.query 可以获取sql语句
    for obj in list:
        print(obj.username)
    list2 = models.UserInfo.objects.filter(username='zs') # 返回类型也是queryset
    list3 = models.UserInfo.objects.filter(age__gt=10) # age>10
    # age__gte=10 age>=10
    # age__lt=10   age<10
    # age__lte=10  age<=10
    # age__in=[10,20,30]  age in (10,20,30)
    # username__contains='张'  包含 '张' %张%
    # username__startswith='张' 以 ‘张’ 开头  张%
    list4 = models.UserInfo.objects.filter(username='zs', password='123')  # and
    list5 = models.UserInfo.objects.exclude(username='zs') # username!='zs'
    # 如果查不到数据,返回依旧是queryset,不过里面没对象[]
	models.UserInfo.objects.filter(username='zs') # queryset[obj,obj]
    models.UserInfo.objects.filter(username='zs').values('username', 'passowrd') # queryset[{},{}]
    models.UserInfo.objects.filter(username='zs').values_list('username', 'passowrd') # queryset[(),()]

    user = models.UserInfo.objects.filter(username='zs').first() # 返回值为对象
    flag = models.UserInfo.objects.filter(username='zs').exists() # 返回值为true false 是否存在

    users1 = models.UserInfo.objects.all().order_by('id') # 排序 asc
    users2 = models.UserInfo.objects.all().order_by('-id') # 排序 desc
    # order_by('-id', 'age') id desc age asc

一对多

def login(request):
    # 一对多查询
    # depart = models.ForeignKey(to='Depart', to_field='id', on_delete=models.CASCADE)
    # 查用户及部门  使用 __
    v = models.User.objects.filter(id=1).first()
    print(type(v.depart)) # 类型为class(为Depart的一个实例对象)  可以使用depart.title获取字段
    v3 = models.User.objects.filter(id__gt=0).select_related('depart')
    for i in v3:
        print(i.name, i.age, i.depart.title)

    v1 = models.User.objects.filter(id=1).values('name','age','depart__title') # [{},{}]
    v2 = models.User.objects.filter(id=2).values_list('name','age','depart__title') # [(),()]
   
    return HttpResponse('hh')

cookie和session

def login(request):
    res = HttpResponse('hello')
    # path是为了设置那个请求访问时携带上cookie /login   domain为了限制域名
    # 响应头中有setCookie: zs:123,超时时间10s
    # secure=True 只有https请求时才携带cookie
    # httponly=True只允许在http中访问
    res.set_cookie('zs', '123', max_age=10, path='/', domain='baidu.com', secure=False, httponly=False)
    # 默认值 浏览器重新打开 / 当前域名  False False
    return res

def home(request):
    cookies = request.COOKIES # 获取所有的cookie
    print(cookies)
    cookie1 = cookies.get('zs') # 根据键获取值
    return HttpResponse(cookie1)

session配置

# session配置
# 存缓存
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 保存会话引擎,缓存.cache,文件.file,数据库.db
SESSION_CACHE_ALIAS = 'default' # 使用哪个缓存保存,默认使用default,可通过CACHES配置
# 存文件
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = 'xxx' # 文件路径
# 存数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 必须将app session的注释打开

SESSION_COOKIE_AGE = 1209600 # 两周超时时间
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 关闭 关闭浏览器cookie过期
SESSION_COOKIE_DOMAIN = None # 域名
SESSION_COOKIE_PATH = '/' #路径
SESSION_SAVE_EVERY_REQUEST = True # 设置每次请求都保存session
SESSION_COOKIE_SECURE = False # 是否https传输cookie
SESSION_COOKIE_HTTPONLY = True # cookie只支持http传输

CACHES = {
    "default": {
        "BACKEND": "django.core.cache.backends.locmem.LocMemCache",
    },
    'redis': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        },
    },
}

注册app(保存在数据库中需要将注释打开)与添加中间件,django项目默认自带

在这里插入图片描述

def login(request):
    request.session['user'] = 'abc' # 设置session
    session = request.session.get('user') # 获取session

demo

实现登录效果

def login(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    user = models.User.objects.filter(username=username,password=password).first()
    if user != None:
        request.session['user'] = user
        return JsonResponse({'msg': 'login success'})
    else:
        return JsonResponse({'msg': 'login fail'})
def home(request):
    user = request.session.get('user')
    if user != None:
        return HttpResponse('success')
    else :
        return HttpResponse('fail')
<script>
    $("#but").click(function(){
        let username = $("#username");
        let password = $("#password");
        $.ajax({
            url: "/login", //请求后端路径
            type: "post", //请求类型
            data: {"username": username.val(), "password": password.val()}, //请求数据(json类型)
            success: function(body){ //回调函数
                //console.log(typeof body)
                alert(body.msg)
            }
        });
    })
</script>

settings文件添加该配置

STATIC_URL = '/static/' # 浏览器可直接访问静态文件
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 存放静态文件的公共文件夹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署DNS解析服务

一、安装软件&#xff0c;关闭防火墙&#xff0c;启动服务 1.yum install -y bind bind-utils bind-chroot 2.systemctl stop firewalld && setenforce 0 3.systemctl start named 二、工作目录 /var/named/chroot/etc #存放主配置文件 /var/named/chroot/var/n…

实施 ASPM 面临哪些挑战?

在保护组织的应用程序时&#xff0c;您可能听说过有关应用程序安全状态管理 (ASPM) 的热议。根据研究称&#xff0c;到 2026 年&#xff0c;超过 40% 的开发专有应用程序的组织将采用应用程序安全态势管理。您意识到它有可能彻底改变您的应用程序安全性。但你也明白&#xff0c…

html标签元素类型,web开发工具

面试题 HTML 1&#xff0c;html5有哪些新特性&#xff1f; 2&#xff0c;html5移除了那些元素&#xff1f; 3&#xff0c;如何处理HTML5新标签的浏览器兼容问题&#xff1f; 4&#xff0c;如何区分 HTML 和 HTML5&#xff1f; CSS 1&#xff0c;CSS 选择符有哪些&#xf…

解决前端性能问题:如何优化大量数据渲染和复杂交互?

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、分页加载数据 二、虚拟滚动 三、懒加载 四、数据缓存 五、减少重绘和回流 …

docker 安装rabbitmq并配置hyperf使用

这里我想完成的是 制作消息&#xff08;多个协程制造&#xff09;——》推送到rabbitmq——》订阅消息队列——》消费消息&#xff08;ws协程客户端【一次消费多条】/ws前端&#xff09; 利用 WebSocket 协议让客户端和服务器端保持有状态的长链接&#xff0c;保存链接上来的客…

Doris——纵腾集团流批一体数仓架构

目录 前言 一、早期架构 二、架构选型 三、新数据架构 3.1 数据中台 3.2 数仓建模 3.3 数据导入 四、实践经验 4.1 准备阶段 4.2 验证阶段 4.3 压测阶段 4.4 上线阶段 4.5 宣导阶段 4.6 运行阶段 4.6.1 Tablet规范问题 4.6.2 集群读写优化 五、总结收益 六…

Scala 之舞:林浩然与杨凌芸的 IDEA 冒险

Scala 之舞&#xff1a;林浩然与杨凌芸的 IDEA 冒险 The Dance of Scala: The IDEA Adventure of Lin Haoran and Yang Lingyun 在那个阳光明媚的日子里&#xff0c;林浩然如同一位英勇的探险家&#xff0c;踏入了 Scala 的 IntelliJ IDEA 开发环境的奇妙领域&#xff0c;他带着…

返回两个数组中每个对应位置的两个元素的最小值np.fmin()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 返回两个数组中 每个对应位置的 两个元素的最小值 np.fmin() 选择题 以下代码输出的结果是&#xff1f; import numpy as np a1 [1,np.nan,3] a2 [3,2,1] print("【显示】a1",a1)…

Vue3:OptionsAPI 与 CompositionAPI的比较

1、Vue2 Vue2的API设计是Options&#xff08;配置&#xff09;风格的。 Options API 的弊端 Options类型的 API&#xff0c;数据、方法、计算属性等&#xff0c;是分散在&#xff1a;data、methods、computed中的&#xff0c;若想新增或者修改一个需求&#xff0c;就需要分别…

C#高级:Winform桌面开发中DataGridView的详解

一、每条数据增加一个按钮&#xff0c;点击输出对应实体 请先确保正确添加实体的名称和文本&#xff1a; private void button6_Click(object sender, EventArgs e) {//SQL查询到数据&#xff0c;存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…

OpenCV学习笔记(一)——Anaconda下载和OpenCV的下载

OpenCV是图象识别中有巨大的应用场景&#xff0c;本篇文章以Python为基础。当初学OpenCV的时候&#xff0c;推使用在Anaconda编写代码&#xff0c;原因比较方便&#xff0c;下面我们对于Anaconda的下载过程进行演示。 Anaconda的下载 首先打开官网www.anaconda.com/download找…

Linux开发板移植rz、sz指令实现串口传输文件

一、开发环境 实现开发板和电脑通过串口来收发互传文件。 开发板&#xff1a;NUC980开发板 环境&#xff1a;Ubuntu 22.04.3 LTS 64-bit lrzsz的源码包:例如 lrzsz-0.12.20.tar.gz&#xff0c;下载地址https://ohse.de/uwe/software/lrzsz.html 二、移植步骤 在开发板上移植…

RabbitMQ(SpringAMQP)

一.SpringAMQP Spring的官方基于RabbitMQ提供了一套消息收发的模板工具&#xff1a;SpringAMQP。并且基于SpringBoot对其实现了自动装配 SpringAMQP官方地址:SpringAMQP SpringAMQP提供的功能: 自动声明队列、交换机及其绑定关系 基于注解的监听器模式&#xff0c;异步接收…

UBOOT和LINUX 调试等级设置

比较好的网页 UBOOT LINUX 设置相关 方法1&#xff1a; echo 5 > /proc/sys/kernel/printk 缺点&#xff1a;方法1无法修改在内核启动时的输出信息 方法2&#xff1a; 通过uboot的环境变量bootargs传递打印级别的参数 set bootargs root/dev/nfs init/linuxrc nfsroot19…

TQTT X310 软件无线电设备的FLASH固件更新方法

TQTT X310 除了PCIE口全部兼容USRP 官方的X310&#xff0c;并配备两块UBX160射频子板以及GPSDO。TQTT X310可以直接使用官方的固件&#xff0c;但是不支持官方的固件升级命令。这篇BLOG提供烧写刷新FLASH的方法。 1&#xff0c;使用的是WINDOWS系统。首先给X310接入电源并开机…

MongoDB获评2023年Gartner®云数据库管理系统“领导者”

MongoDB 很荣幸在《2023 年 Gartner 云数据库管理系统 (CDBMS) 魔力象限》报告中被评为领导者。我们相信这一成就让 MongoDB 成为唯一一家连续两年斩获“领导者”称号的纯应用程序数据库服务提供商。 社区及开发者数据平台用户的需求一向是 MongoDB 关注的重点&#xff0c;而这…

音视频开发之旅——音频基础概念、交叉编译原理和实践(LAME的交叉编译)(Android)

本文主要讲解的是音频基础概念、交叉编译原理和实践&#xff08;LAME的交叉编译&#xff09;&#xff0c;是基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo 音频基础概念 在进行音频开发的之前&#xff0c;了解声学的基础还是很有必要的。 声音…

Redis之事务(详细解析)

请直接看原文:不能回滚的Redis事务还能用吗 - 知乎 (zhihu.com) ------------------------------------------------------------------------------------------------------------------------------ 1、Redis事务的概念&#xff1a; Redis 事务的本质是一组命令的集合。…

HCIA-Datacom题库(自己整理分类的)_38_IPv6多选【20道题】

1.IPV6地址包含以下哪些类型&#xff1f; 任播地址 组播地址 单播地址 广播地址 2.IPv6有以下哪几种地址&#xff1f; 任播地址 链路本地地址 组播地址 单播地址 广播地址 3.下面关于IPv6描述正确的是&#xff1f; IPv6的地址长度为128bits IPv6的地址长度为64bit…